我不知道是否有任何算法可以获得基于密钥的数据分区的最佳分区(需要确保相同结果数据集中的相同密钥记录)。
例如:我有一个数据集需要分为两部分:
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)
后一个分区比前一个更好,因为它允许在两个部分中更均匀地分配记录的数量。
所以,我需要一个algrithm来找到最佳分区。
有人能就这个话题给我一些建议吗?我怎么能解决这个问题?
感谢。
答案 0 :(得分:1)
Java的默认hashCode()
方法适用于此。显然,如果样本量为45,您可能会得到一些差异,但在大数据量表上,它是无关紧要的,并且趋向于均匀分布。
答案 1 :(得分:1)
除非您对每个密钥的预期基数有一些先验知识(基于历史结果或其他),否则最好坚持使用“随机”分区方案,如默认分区方案(基于对象哈希码) - 正如@ benwatsondata的回答所示。
但是,如果您使用的是非常小的密钥(例如国家或大陆)以及它们之间的基数差异(假设您有欧洲或北美数百万的价值,而南美只有数千种价值) ,你需要提出一个基于关键“排名”的分区器。
作为一个简单示例,您可以使用一个分区程序,只需将每个密钥映射到一个分区,然后再回到未知密钥的哈希码默认值。针对3个减速器调整的映射将是:
Europe -> P1
North America -> P2
Asia -> P3
South America -> P3
Australia -> P2
Africa -> P1
__default__ -> hashCode-based
上述更智能的版本将获得减速器数量和排序列表作为参数,它将找出最佳分区方案本身。