我有一些以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/

10-16 03:24