为什么 Delta Lake 似乎存储了如此多的冗余信息?

Why does Delta Lake seem to store so much redundant information?

我刚开始使用 delta lake,所以我的心智模型可能不对 - 我问这个问题是为了 validate/refute 它。

我对 delta lake 的理解是它只存储对数据的增量 更改(“delta”)。有点像 git - 每次提交时,您都不会存储代码库的完整快照 - 提交仅包含您所做的更改。 同样,我会想象如果我创建一个 Delta table 然后我尝试用它已经包含的所有内容(即“空提交”)“更新”table 那么我不希望看到由于该更新而创建的任何新数据。

然而,这不是我所观察到的:这样的更新似乎复制了现有的 table。这是怎么回事?这对我来说似乎不是很“增量”。

(为了便于阅读,我将替换文件名中的实际 UUID 值)

# create the data
dataGen = sc._jvm.org.apache.hudi.QuickstartUtils.DataGenerator()
inserts = sc._jvm.org.apache.hudi.QuickstartUtils.convertToStringList(dataGen.generateInserts(200))
df = spark.read.json(spark.sparkContext.parallelize(inserts, 2))

delta_base_path = "s3://my-delta-table/test"
(df.write.format("delta")
 .mode("overwrite")
 .save(delta_base_path))
!aws s3 ls --recursive s3://my-delta-table/test

2020-10-19 14:33:21       1622 test/_delta_log/00000000000000000000.json
2020-10-19 14:33:18          0 test/_delta_log_$folder$
2020-10-19 14:33:19      10790 test/part-00000-UUID1-c000.snappy.parquet
2020-10-19 14:33:19      10795 test/part-00001-UUID2-c000.snappy.parquet

然后我使用完全相同的数据集覆盖:

(df.write.format("delta")
 .mode("overwrite")
 .save(delta_base_path))

!aws s3 ls --recursive s3://my-delta-table/test
2020-10-19 14:53:02       1620 test/_delta_log/00000000000000000000.json
2020-10-19 14:53:08        872 test/_delta_log/00000000000000000001.json
2020-10-19 14:53:01          0 test/_delta_log_$folder$
2020-10-19 14:53:07       6906 test/part-00000-UUID1-c000.snappy.parquet
2020-10-19 14:53:01       6906 test/part-00000-UUID3-c000.snappy.parquet
2020-10-19 14:53:07       6956 test/part-00001-UUID2-c000.snappy.parquet
2020-10-19 14:53:01       6956 test/part-00001-UUID4-c000.snappy.parquet

现在有两个 part-0part-1,大小完全相同。为什么达美不对现有数据进行重复数据删除?

这不是完全正确的理解 - Delta 不会自动检查现有数据是否重复 - 如果你只想存储 new/updated 数据,那么你需要使用 merge operation 来检查现有数据,然后您可以决定如何处理现有数据 - 用新数据覆盖,或者忽略它。

您可以在 Delta 网站或 Learning Spark 第 9 章第 2 版书籍(freely available from Databricks

中找到更多信息