在s3中,是否可以将Parquet数据在所有分区中进行排序,并将数据分成相等的分区(计算我有多少数据并将其分成64或128个分区以获得相等的文件)?
将所有内容排序并等分的原因是在s3中有更好的压缩性,并且在从s3查询数据时减少了athena中的扫描次数。
我尝试了以下方法:
正在重新分区 df.orderBy(col1, col2).repartition(100).write('s3://')
-提供相等的分区,但由于洗牌2次(orderby和重新分区),排序顺序未保持
做orderby然后合并 df.orderBy(col1, col2).coalesce(100).write('s3://')
-保留顺序但产生不相等的分区,有时我需要增加spark.sql.shuffle.partitions上的分区数,而coalesce不会这样做。
执行orderby并依赖spark.sql.shuffle分区: --conf spark.sql.shuffle.partitions=100, df.orderBy(col1, col2).write('s3://')
-保留顺序,但输出文件不是等分的。
解决方法:
我可以做“二次排序”,比如 repartition(100).sortWithinPartitions(col1, col2)
但这不会是“全球性”的
使用选项3创建一个自定义分区器,以确保分区相等(但在pyspark中,使用自定义分区器有点问题)
我可以考虑的另一个选择是按范围分区,然后按排序分区。这应该会给出总的排序,但要适当地确定这些范围并不容易,因为数据可能有不同的“风格”。
有没有想过我在这里错过了什么。。。
暂无答案!
目前还没有任何答案,快来回答吧!