当前位置: 首页 > 知识库问答 >
问题:

Databricks表/架构部署

巫坚白
2023-03-14

目的

我们使用Databricks集群进行ETL流程,使用Databricks笔记本进行DS、ML和QA活动。

目前,我们不使用Databricks目录或外部Hive Metastore。我们以Spark StructType格式编程定义模式,并将路径硬编码如下:

表/some_table.py

class SomeTable(TableBase):

   PATH = os.getenv('SOME_TABLE_PATH', /some_folder/some_subfolder/) # actually it's passed as constructor arg

   SCHEMA = {
       "type": "struct",
       "fields": [
          {
              "name": "some_field",
              "type": "string",
              "nullable": true
          },
          ...
       ]

   def schema() -> StructType:
       return StructType.fromJson(self.SCHEMA)

   def save(df: DataFrame):
       df.write.parquet(self.PATH)

   def read(year: str, month: str, day: str) -> DataFrame:
       return self.spark \
           .read \
           .parquet(self.PATH) \
           .filter((F.col('YEAR') == year) & ...)

我们时不时地进行一些重构,更改表的路径、模式或分区。这是一个问题,因为Database ricks是开发人员、QA和数据科学家之间的共享平台。每次更改时,我们都必须更新所有笔记本并在多个地方留档。

此外,我还想在将来使用扣扣(聚类)、表统计、德尔塔湖、SQL语法数据探索、视图和一些安全特性。这些特性还需要数据库可访问的表定义。

您通常如何部署Database ricks模式及其更新?我应该使用SQL脚本,这些脚本在集群启动时由基础架构即代码工具自动执行吗?或者有更简单/更好的解决方案吗?

使用数据砖/火花写入的数据框的架构可以使用 df.write.saveAsTable(“some_table”)创建。但这不是最好的解决方案,因为:

>

  • 我想在第一次写入之前定义模式。例如,我正在将500列的数据集转换为100列,并且希望根据模式定义仅选择必需的列。

    有一些只读数据集与其他工具(如ADF或Nifi)一起摄取(写入)

    使现代化

    我喜欢使用AWS Glue(被EMR用作Hive Metastore)并通过云形成进行部署的经验。我想Database ricks有类似甚至更简单的体验,只是想知道什么是最佳实践。

    更新 #2

    回答问题的额外要点 - 如何在Databricks目录(或外部Hive Meta存储)和我们的代码库之间不重复shcema定义?

    如果我们用SQL语法描述我们的模式,我们将不能在单元测试中重用它们。对于基于上述格式部署模式,有什么干净的解决方案吗(参见代码片段)?

    PS:目前我们使用Azure云

  • 共有1个答案

    伯君浩
    2023-03-14

    对于AWS上的Databricks,AWS Glue Catalog是一种强大的方法,可以将您的元存储集中到所有计算和查询引擎中。您可以使用相同的数据定义。Glue Catalog促进云范围的数据策略,避免使用特定于产品的数据目录和访问控制创建数据仓库。有关详细信息,请参阅此Databricks博客文章:https://docs.databricks.com/data/metastores/aws-glue-metastore.html

    在性能方面,通过定义架构,您将看到提升,并且您将能够收集表

    Spark 可以在读取镶木地板或三角洲湖表时找出架构。对于 Parquet 表和 JSON 表,您可以通过仅向 Spark 提供一个要从中推断架构的文件,然后在下一遍中读取整个文件夹来加快架构推理。元存储可以避免这种麻烦并加快查询速度。

     类似资料:
    • 嘿,我想将ConFluent模式注册表与Avro Serializers一起使用:留档现在基本上是说:不要为多个不同的主题使用相同的模式 谁能解释一下原因吗?我重新搜索了源代码,它基本上将模式存储在Kafka主题中,如下所示(topicname,magicbytes,version- 因此,除了冗余之外,我看不到多次使用模式的问题?

    • 部署架构上采用三台机器,一个Master接受写请求,两个Slave进行数据同步,三台机器上都部署sentinel(一般为奇数个,因为需要绝大部分进行投票才能failover)。(官方示例)具体架构如下图: 注意:如果有条件可以将sentinel多部署几个在客户端所在的应用服务器上,而不是与从节点部署在一起,这样避免整机宕机后sentinel和slave都减少而导致的切换选举sentinel无法超过

    • 我正在做一些POC来从Databrics中的dataframe中加载雪花表。我已经成功地加载了表,但是它改变了表的结构。 请注意,主键约束消失了,FNT_DT_PK字段不再为not NULL,最后,每个VARCHAR字段的数据类型长度都更改为16777216。 我在Databricks中的python代码非常简单: 你知道为什么在雪花中改变了表的结构吗?

    • 我正在尝试从模式注册表中检索给定kafka主题的模式主题版本。我可以使用成功发布新版本,但我不确定如何检索版本。我在下面尝试使用curl请求,但结果立即命中-1(空)。 我如何修复这个GET请求,或者更好的是,我应该如何使用模式注册中心来检索一个模式?

    • 问题内容: 给定一个SQLConnection对象,如何获得单个表的架构? 前几天我在尝试这种方法,我似乎能够从运行查询所获得的数据集中获取模式,但是我可以从连接中获得的所有模式信息似乎都与可用的表有关。而不是表格上的实际详细信息。 我敢肯定有一个简单的方法可以做到这一点。 问题答案: 我认为从查询(通过GetSchemaTable)访问架构是唯一的方法。如果您只对模式感兴趣,则可以运行不返回任何

    • 1)我应该能够通过addedtime进行范围查询,比如从x日期到y日期 2)我应该能够按appname查询,并使用addedtime按升序排列行 我怎样才能做到这一点?我可以更改表模式。 另外,我已经创建了两个DC和三个节点的Cassandra集群。