我有 2 个火花作业,一个是预处理,第二个是过程。处理作业需要为数据中的每个用户进行计算。我想避免像groupBy那样的随机播放,所以我考虑将预处理的结果保存为Parquet中的用户存储桶,或者按用户重新分区并保存结果。
什么是偏好?以及为什么
可以减少partitionBy
和bucketBy
之间的选择以确定数据基数:
- 低基数 -> 分区
- 高基数 -> 桶
但是,两者都不用于聚合。有用于谓词下推的,仅此而已。因此,当您的目标是避免像 groupBy 这样的随机播放时,它们不会有太大用处,尽管将来可能会随着新 API 而改变。
请阅读两到三次以了解这一点。
在我的建议中,您应该使用重新分区,因为分区有很多随机。因为它将使用所有分区键在HDFS中创建文件夹,并且会将数据添加到不同的文件中,这是一个非常昂贵的过程。此外,bucketby 属性加起来相同,但按照其上一个分区的顺序在文件夹中创建文件。
另一方面,重新分区创建存储在文件中的所有数据的哈希表,该表按您在此处提到的键排序。数据随机只是为了匹配您在重新分区属性中提到的文件数量,而这更便宜且速度相当快。此外,如果要对此数据进行分组,则运行时间将与分区相同。通过重新分区u,只需减少预处理的运行时间。