Hadoop 如何获得最均匀的分区结果?

Hadoop 如何获得最均匀的分区结果?,hadoop,partitioning,partition,data-partitioning,hadoop-partitioning,Hadoop,Partitioning,Partition,Data Partitioning,Hadoop Partitioning,我不知道是否有任何方法可以获得基于密钥的数据分区的最佳分区(需要确保在相同的结果数据集中有相同的密钥记录) 例如:我有一个数据集需要分为两部分: 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:

我不知道是否有任何方法可以获得基于密钥的数据分区的最佳分区(需要确保在相同的结果数据集中有相同的密钥记录)

例如:我有一个数据集需要分为两部分:

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)
后一个分区比前一个分区好,因为它允许记录数更均匀地分布在两部分中

所以,我需要一个算法来找到最优分割

有人能给我一些关于这个话题的建议吗?我如何处理这个问题


谢谢。

Java的默认
hashCode()
方法适用于此。显然,如果样本量为45,你可能会得到一些差异,但在大数据规模下,这是不相关的,而且会趋向于均匀分布。

除非你事先知道每个关键点的预期基数(基于历史结果或其他什么),否则最好坚持“随机”类似于默认的分区方案(基于对象哈希代码)——如@benwatsondata的回答所示

但是,如果您使用的键集非常小(如国家或大陆),并且它们之间的基数存在巨大差异(假设您在欧洲或北美有数百万个值,而在南美只有数千个值),那么您需要根据键“排名”找到一个分区器

作为一个简单的例子,您可以有一个分区器,它只将每个键映射到一个分区,并返回到未知键的hashcode默认值。为3个减速器调整的映射为:

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

更聪明的版本会将减缩器的数量和排名列表作为参数,它会找出最佳分区方案本身。

虽然我同意你的说法,但问题(某种程度上)意味着OP对默认分区器不满意,所以我不认为推荐一个是一个有用的答案。他认为他不快乐。这并不影响我的答案是否正确。我想值得补充的是,盲目地将
hashCode()
应用于整个键并不适用于所有情况,对于简单的文本键(如示例中提供的文本键)也可以。我对你的建议投赞成票,尽管只有当密钥的数量随着数据集的大小而增长时,它才成立。如果密钥是大陆呢?是的,我也可以根据记录的数量对所有密钥进行排序,然后我可以使用贪婪策略来实现这一点。在大多数情况下,它将趋向于均匀分布。我想知道是否有一种算法可以获得理论上的最优解。也许是分配计划的一些算法,但我不确定。所以请求帮助吧