我有两个火花工作,一个是预处理,第二个是流程。 处理作业需要为数据中的每个用户计算。 我想避免像groupBy这样的shuffle,所以我考虑将预处理的结果保存为Parquet中的用户,或者按用户重新分区并保存结果。
更喜欢什么?为什么
答案 0 :(得分:3)
可以减少partitionBy
和bucketBy
之间的选择以确定数据基数:
但是,它们都不用于聚合。用于谓词下推,仅此而已。因此,当你的目标是以避免像groupBy 这样的混乱时,它们将会有很大的用处,尽管将来可能会使用新的API进行更改。
答案 1 :(得分:0)
请阅读两次或三次以了解该内容。
在我的建议中,您应该使用repartition,因为partitionby有很多改组。由于它将使用所有分区键在HDFS中创建文件夹,并且进一步将数据添加到不同的文件中,这是非常昂贵的过程。同样,bucketby属性会添加相同的内容,但会按照其先前分区的顺序在文件夹内创建文件。
另一方面,分区将创建存储在文件中的所有数据的哈希表,该哈希表将按此处提到的键进行排序。数据改组只是与您在repartition属性中提到的文件数量相匹配,而后者便宜且速度很快。另外,如果您想对这些数据进行分组,则运行时间将与partitionby相同。通过重新分区,您只需减少预处理的运行时间。