我不想丢失数据,不管分区如何。但是,在以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使用了一个基于散列的分区器,所以可能这就是重复项的用途。
为什么数据会丢失?如何确保重新分区不会使我丢失数据?
暂无答案!
目前还没有任何答案,快来回答吧!