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 读取时,它没有有关已删除文件的信息,因此它会读取目录中的所有内容,因此您会得到两倍的行数。
我在 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 读取时,它没有有关已删除文件的信息,因此它会读取目录中的所有内容,因此您会得到两倍的行数。