如何从 Kubernetes 向 Delta Lake 写入数据

How to write data to Delta Lake from Kubernetes

我们的组织 运行s Databricks on Azure,数据科学家和分析师主要将其用于笔记本,以便进行临时分析和探索。

我们还 运行 Kubernetes 集群用于不需要 spark 的 ETL 工作流。

我们想使用 Delta Lakes 作为我们的存储层,Databricks 和 Kubernetes 都可以作为第一个 class 公民进行读写。
目前,我们的 Kubernetes 作业将 parquet 直接写入 blob 存储,另外还有一个作业可以启动 databricks 集群,以将 parquet 数据加载为 Databrick 的 table 格式。这既慢又贵。

我想做的是直接从 Kubernetes python 写入 Delta lake,而不是先将 parquet 文件转储到 blob 存储,然后触发额外的 Databricks 作业将其加载为 Delta lake 格式.
相反,我还想利用 Delta lake 从 Kubernetes 进行查询。


简而言之,我如何设置我的 Kubernetes python 环境,使其对现有 Databricks Delta Lake 具有平等的写入和查询访问权限?
代码将不胜感激。

您可以通常可以使用Delta connector for Spark. Just start a Spark job with necessary packages and configuration options写入Delta table:

spark-submit --packages io.delta:delta-core_2.12:1.0.0 \
  --conf "spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension" 
  --conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog" 
...

并以与 Databricks 相同的方式编写:

df.write.format("delta").mode("append").save("some_location")

但是通过使用 Delta 的 OSS 版本,您可能会失去一些仅在 Databricks 上可用的优化,例如 Data Skipping 等 - 在这种情况下,从 Kubernetes 写入的数据的性能 可能会更低(实际上取决于您如何访问数据)。

可能会出现无法写入由 Databricks 创建的 Delta table 的情况 - 当 table 是由 OSS Delta 连接器支持的编写器版本更高的编写器编写时(请参阅Delta Protocol documentation). For example, this happens when you enable Change Data Feed 在写入数据时执行额外操作的 Delta table。

在 Spark 之外,有计划实现在 Rust 中实现的所谓 Standalone writer for JVM-based languages (in addition to existing Standalone reader). And there is a delta-rs project(具有 Python 和 Ruby 的绑定)应该能够写入 Delta table(但我自己还没有测试过)

更新 14.04.2022:从 1.2.0 版本开始,OSS Delta 也可以使用数据跳过