1

我不知道是否有任何算法可以为基于键的数据分区获取最佳分区(需要确保同一结果数据集中的相同键记录)。

例如:我有一个数据集需要分成两部分:</p>

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)

后一个分区比前一个分区要好,因为它允许记录的数量更均匀地分布在两个部分。

所以,我需要一个算法来找到最佳分区。

谁能给我一些关于这个话题的建议?我该如何解决这个问题?

谢谢。

4

2 回答 2

1

Java 的默认hashCode()方法对此很好。显然,对于 45 的样本量,您可能会得到一些差异,但在大数据规模上,它是无关紧要的,并且会趋于均匀分布。

于 2015-02-08T09:39:37.990 回答
1

除非您对每个键的预期基数有一些先验知识(基于历史结果或其他),否则最好坚持使用“随机”分区方案,如默认方案(基于对象哈希码)——如@benwatsondata 的回答。

但是,如果您使用的密钥集非常少(如国家或大陆)并且它们之间的基数差异很大(假设您在欧洲或北美有数百万个值,而对于南美只有数千个值),您需要提出基于关键“排名”的分区器。

举个简单的例子,你可以有一个分区器,它简单地将你的每个键映射到一个分区,并回退到未知键的哈希码默认值。为 3 个 reducer 调整的映射将是:

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

上面的一个更智能的版本将同时获得 reducer 的数量和排名列表作为参数,它会自己计算出最佳的分区方案。

于 2015-02-08T10:25:55.003 回答