什么是首选,桶或重新分区?

时间:2017-10-31 13:20:02

标签: apache-spark hive apache-spark-sql

我有两个火花工作,一个是预处理,第二个是流程。 处理作业需要为数据中的每个用户计算。 我想避免像groupBy这样的shuffle,所以我考虑将预处理的结果保存为Parquet中的用户,或者按用户重新分区并保存结果。

更喜欢什么?为什么

2 个答案:

答案 0 :(得分:3)

可以减少partitionBybucketBy之间的选择以确定数据基数:

  • 低基数 - >分区
  • 高基数 - >桶

但是,它们都不用于聚合。用于谓词下推,仅此而已。因此,当你的目标是以避免像groupBy 这样的混乱时,它们将会有很大的用处,尽管将来可能会使用新的API进行更改。

答案 1 :(得分:0)

请阅读两次或三次以了解该内容。

在我的建议中,您应该使用repartition,因为partitionby有很多改组。由于它将使用所有分区键在HDFS中创建文件夹,并且进一步将数据添加到不同的文件中,这是非常昂贵的过程。同样,bucketby属性会添加相同的内容,但会按照其先前分区的顺序在文件夹内创建文件。

另一方面,分区将创建存储在文件中的所有数据的哈希表,该哈希表将按此处提到的键进行排序。数据改组只是与您在repartition属性中提到的文件数量相匹配,而后者便宜且速度很快。另外,如果您想对这些数据进行分组,则运行时间将与partitionby相同。通过重新分区,您只需减少预处理的运行时间。