1

0 から 2 億程度の範囲の ID でキー付けされたデータがいくつかあり、0 から 5 ミル、5 ミルから 10 ミルなどの範囲のドルに分割する必要があります。

コードの最後の部分が次のようになるように、この最後の部分に 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;、デフォルトの動作でハッシュ分散されているようです。

4

2 に答える 2

0

これを行う1つの方法は次のとおりです。

A = LOAD ............
SPLIT A INTO B IF <your range condition> , C IF < your range condition>
STORE B ...
STORE C ...

または、これを試すことができます:

 B = FILTER A BY $1 >= <lower_Range> AND $1 <= <upper_Range>;

また、既にカスタム パーティショナーを作成しているので、これを MapReduce で実装するのは簡単です。

Map クラスはペアを出力するだけで、カスタム パーティショナーは適切な範囲の値を特定のレデューサーに送信します。ただし、入力データを分割したら正確に何をしたいのかわからないため、リデューサーが何をしなければならないかについてコメントすることはできません。

Main メソッドでカスタム パーティショナー クラスを次のように設定できます。

Job.setPartitionerClass(<your custom partitioner class>);
于 2013-07-09T22:55:47.840 に答える