在pyspark中保存重新分区的Dataframe时无法保留数据

q35jwt9p  于 2021-05-29  发布在  Spark
关注(0)|答案(0)|浏览(341)

我不想丢失数据,不管分区如何。但是,在以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()

事实证明,没有可以忽略的重复项。我认为在重写时会忽略重复项的原因是,iirc,parquet writer使用了一个基于散列的分区器,所以可能这就是重复项的用途。
为什么数据会丢失?如何确保重新分区不会使我丢失数据?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题