在将重新分区的数据帧保存在PySpark中时无法保留数据

时间:2020-06-22 17:21:23

标签: python-3.x dataframe apache-spark pyspark parquet

无论分区如何,我都不会丢失数据。但是,以Parquet文件格式将重新分区的数据写入目标时,会删除一些行。

这是我的工作:

src_path = 's3a://source_bucket/extraction/sos/parquet/sysctl/'
df = spark.read.parquet(f'{src_path}')
df.rdd.getNumPartitions()
>> 154
df.count()
>>> 783283
dest_path = 's3a://DEST_BUCKET/extraction/sos/parquet/sysctl/'
df = df.repartition(154) # doing this because then the written data is partitioned into ~ 140 partitions
df.write.parquet(dest_path, mode='overwrite')
df2 = spark.read.parquet(f'{dest_path}')
df2.rdd.getNumPartitions()
>>> 152 # as you can see, I lost 2 partitions ( from 154 to 152 ).
df2.count()
>>> 773165

我考虑了可能存在一些重复行的情况(即使重复行不应该这样删除),因此,我执行了以下检查:

df.distinct().count()
>>> 783323 # this is the same as df.count()

结果是,没有任何重复项可以忽略。我认为重复进行重写时会遗漏重复项的原因是,Parquet编写者IIRC使用基于哈希的分区程序,因此重复项可能就在这里。

为什么丢失数据?如何确保重新分区不会使我丢失数据?

0 个答案:

没有答案
相关问题