目标
我们将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云
1条答案
按热度按时间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提供一个文件来推断模式,然后在下一步中读取整个文件夹,从而加快模式推断的速度。元存储可以避免这种麻烦并加快查询速度。