Pyspark dataframe parquet 与 delta:不同的行数

Flx*_*xnt 5 apache-spark parquet pyspark delta-lake

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

spark.read.parquet()但是当使用 Pyspark 读取数据时,如果使用或读取数据帧,我会得到不同的结果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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,差异相当大。

我对 Delta 与 Parquet 有什么误解吗?

Pyspark 版本是2.4.

Ale*_*Ott 13

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

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