Pyspark dataframe parquet vs delta:不同的行数

Pyspark dataframe parquet vs delta : different number of rows

我在 HDFS 上用 Delta 写入了数据。据我了解,Delta 将数据存储为 parquet,只是在其上多了一个具有高级功能的层。

但是当使用 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 与 parquet 有什么误解吗?

Pyspark 版本为 2.4

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

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