我有一些以id为键的数据在0到200左右的百万之间,我需要将其拆分为bucks,范围为0-5mil,5mil-10mil等。
我试图在Hadoop的最后一部分中使用自定义分区程序,以使我的代码的最后一部分看起来像这样:
Conns = FOREACH ConnsGrouped GENERATE group as memberId, $1.companyId as companyIds;
ConnsPartitioned = DISTINCT Conns PARTITION BY com.mypackage.SearchNodePartitioner PARALLEL 50;
rmf $connections_file
Store ConnsPartitioned INTO 'test' using AvroStorage(...);
我的分区器看起来像这样:
public class SearchNodePartitioner<Long, V> implements Partitioner<Long, V>
{
@Override
public void configure(JobConf conf)
{
// Nothing
}
@Override
public int getPartition(Long key, V value, int numPartitions)
{
return new Double(Math.floor(key / (5.0 * Math.pow(10, 6)))).intValue() % numPartitions;
}
}
但它似乎根本没有被调用。即使当我将返回行替换为
return 1;
时,跨文件的数据似乎仍使用默认行为进行哈希分布。 最佳答案
DISTINCT +自定义分区程序的答案是:您不能再这样做了(正如我刚刚发现的那样)。 DISTINCT现在使用优化的特殊分区程序。
看到:
http://mail-archives.apache.org/mod_mbox/pig-user/201307.mbox/%3C14FE3AC3-DBA5-4898-AF94-0C34819A0D8B%40hortonworks.com%3E
https://issues.apache.org/jira/browse/PIG-3385
解决方法:
A = //一些元组...;
B = GROUP A BY字段PARTITION BY自定义;
使用...将B存储到“foo”中
后来:
B =使用...加载'foo'
A = FOREACH B生成FLATTEN($ 1);
关于hadoop - Hadoop中的自定义分区程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17554593/