如何获得最统一的分区结果?

iyfjxgzm  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(360)

我不知道是否有任何方法来获得基于密钥的数据分区的最佳分区(需要确保在相同的结果数据集中有相同的密钥记录)。
例如:我有一个数据集需要分成两部分:

key  num_of_records
k1 20
k2 15
k3 2
k4 3
k5 5

有2^5种不同的分区。例如

part1: k1 k3 k4 (total records: 25)
part2: k2 k5 (total records 20)

另一个分区是:

part1: k1 k4 (total records 23)
part2: k2 k3 k5 (total revords 22)

后一个分区比前一个分区好,因为它允许记录数更均匀地分布在两部分中。
所以,我需要一个算法来找到最优分割。
有谁能给我一些关于这个主题的建议吗?我如何处理这个问题?
谢谢。

jvlzgdj9

jvlzgdj91#

除非您事先知道每个键的期望基数(基于历史结果或其他什么),否则最好使用“随机”分区方案,比如默认的分区方案(基于对象哈希码),如@benwatsondata的答案所示。
但是,如果您使用的键集非常小(如国家或大陆),并且它们之间的基数存在巨大差异(假设您在欧洲或北美有数百万个值,而在南美只有数千个值),则需要根据键“排名”提出一个分区器。
作为一个简单的例子,您可以有一个分区器,它只是将每个键Map到一个分区,并返回到未知键的hashcode默认值。为3个减速器调整的Map为:

Europe -> P1
North America -> P2
Asia -> P3
South America -> P3
Australia -> P2
Africa -> P1
__default__ -> hashCode-based

上面的一个更聪明的版本将同时得到减缩器的数量和排序列表作为参数,它将自己找出最优的分区方案。

xkrw2x1b

xkrw2x1b2#

java的默认值 hashCode() 这个方法很好。很明显,如果样本量为45,你可能会得到一些差异,但在大数据规模上,这是不相关的,而且会趋于均匀分布。

相关问题