Pyspark 数据帧拼花与 delta:不同的行数

问题描述

我在 HDFS 上用 Delta 写入了数据。据我了解,Delta 将数据存储为镶木地板,只是在其上增加了一层具有高级功能的附加层。

但是当使用 Pyspark 读取数据时,如果使用 spark.read.parquet()spark.read.format('delta').load() 读取数据帧,我会得到不同的结果

df = spark.read.format('delta').load("my_data")
df.count()
> 184511389

df = spark.read.parquet("my_data")
df.count()
> 369022778

如您所见,差异非常大。

我对 delta 与镶木地板有什么误解吗?

Pyspark 版本为 2.4

解决方法

最可能的解释是您使用 overwrite 选项两次写入 Delta。但是 Delta 是版本化的数据格式——当你使用 overwrite 时,它不会删除以前的数据,它只是写入新文件,并且不会立即删除文件——它们只是在 Delta 的清单文件中被标记为已删除使用。当您从 Delta 读取时,它知道哪些文件被删除了,或者没有,并且只读取实际数据。当您在 Delta Lake 上执行 VACUUM 时,会实际删除数据文件。

但是当您使用 Parquet 读取时,它没有有关已删除文件的信息,因此它会读取您在目录中的所有内容,因此您获得的行数是原来的两倍。