databricks表/模式部署

vom3gejh  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(469)

目标

我们将databricks集群用于etl过程,将databricks笔记本用于ds、ml和qa活动。
目前,我们不使用databricks目录或外部配置单元元存储。我们以spark structtype格式编程定义模式,硬代码路径如下:
表/一些表.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) & ...)

问题

我们不时地进行一些重构,更改表的路径、模式或分区。这是一个问题,因为databricks是开发人员、qa和数据科学家之间的共享平台。每次更改时,我们必须在多个位置更新所有笔记本和文档。
我还想在将来使用bucketing(集群)、表统计、delta lake、sql语法数据探索、视图和一些安全特性。这些特性还需要可供databrick访问的表定义。

问题

您通常如何部署databricks模式及其更新?我应该使用由infrastructure-as-a-code工具在集群启动时自动执行的sql脚本吗?还是有更简单/更好的解决方案?
使用databricks/spark编写的Dataframe的模式可以通过 df.write.saveAsTable('some_table') . 但这不是最好的解决方案,因为:
我想在第一次写之前有一个模式定义。例如,我正在将500列的数据集转换为100列,并且只希望根据模式定义选择所需的列。
有一些只读数据集是通过其他工具(如adf或nifi)接收(写入)的

升级版

我喜欢使用aws glue(由emr用作hive metastore)并通过云形成进行部署的经验。我想databricks有类似甚至更简单的经验,只是想知道什么是最佳实践。

升级2

回答问题的额外要点-如何在databricks目录(或外部配置单元元存储)和我们的代码库之间不复制shcema定义?
如果我们用sql语法描述模式,我们将无法在单元测试中重用它们。是否有基于上述格式部署模式的干净解决方案(请参阅代码段)?

p、 s。

目前我们使用azure云

mum43rcc

mum43rcc1#

对于aws上的databricks,aws glue catalog是一种强大的方法,可以跨所有计算和查询引擎集中元存储,并且可以使用相同的数据定义。glue catalog促进了云范围的数据策略,避免了使用特定于产品的数据目录和访问控制创建的数据孤岛。有关更多信息,请参阅databricks博客:https://docs.databricks.com/data/metastores/aws-glue-metastore.html
性能方面,您将看到通过定义模式的提升,并且您将能够在元存储中收集表和列统计信息。delta lake将在delta事务日志中收集文件级统计信息,从而启用数据跳过。一致地使用粘合目录将防止模式复制。
spark在读取parquet或delta-lake表时可以找出模式。对于parquet和json表,您可以通过向spark提供一个文件来推断模式,然后在下一步中读取整个文件夹,从而加快模式推断的速度。元存储可以避免这种麻烦并加快查询速度。

相关问题