0

AskUbuntuデータセットでMapreduceプログラムを実際に試しています。

私のマッパー出力は

構文

Key: TAG-<TAG_NAME>-<PARAM>  Value: <PARAM>-<Count>

例:

Key - TAG-windows-QUE Value - QUE-1241
Key - TAG-windows-VIEWS Value - VIEWS-4369
Key - TAG-windows-QUE Value - QUE-1
Key - TAG-windows-VIEWS Value - VIEWS-1

Partitionerを使用して、キーの最初の 3 文字に基づいてパーティション分割しています。すなわち。鬼ごっこ

また、値のセットをグループ化するためにValueGroupingComparatorを使用しています。TAG-windows

public static class ValueGroupingComparator implements RawComparator<Text> {

        /*value grouping comparator will group by the first few letters of the key till a second hyphen (“-”) symbol  is found. */
        public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
            String sOne = new String(b1);
            String sTwo = new String(b2);

            // return new Character((char)b1[0]).compareTo((char)b2[0]);
            return sOne.substring(0, sOne.indexOf('-', 4)).compareTo(
                    sTwo.substring(0, sTwo.indexOf('-', 4)));
        }

        public int compare(Text o1, Text o2) {
            return compare(o1.getBytes(), 0, o1.getLength(), o2.getBytes(), 0,
                    o2.getLength());
        }
    }

*

次に、KeyComparator を使用してキーに基づいてキーを並べ替える必要があります。

*

この API は、setOutputKeyComparator を組み合わせて使用​​して、値のセカンダリ ソートをシミュレートできるというメッセージを伝えます。 http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/mapred/JobConf.html

Reducerへの期待される入力

Key - TAG-windows-QUE 
Value - 1241-QUE,1-QUE,4369-VIEWS,1-VIEWS

Reducer から以下を出力できるように

Key - TAG-windows Value - QUE-1242, VIEWS-4370

次のKeyComparatorを試しました。しかし、期待した出力を達成できません

public static class KeyComparator extends WritableComparator {
    public KeyComparator() {
        super(Text.class);
    }

    public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {

        int hypen = '-';
        int s1Ind = 0;
        int s2Ind = 0;
        for (int i = 4; i < b1.length; i++) {
            if (b1[i] == hypen) {
                s1Ind = i;
                break;
            }
        }

        for (int i = 4; i < b2.length; i++) {
            if (b2[i] == hypen) {
                s2Ind = i;
                break;
            }
        }

        if (s1Ind == 0 || s2Ind == 0)
            System.out.println(s1Ind + "<->" + s2Ind);

        int compare = compareBytes(b1, s1, s1Ind, b2, s2, s2Ind);
        if (compare == 0) {
            return compareBytes(b1, s1Ind + 1, l1 - s1Ind + 2, b2,
                    s2Ind + 1, l2 - s2Ind + 2);             
        }
        return compare;
    }
}

ここにいる hadoop mapreduce の専門家の助けが必要です。

4

1 に答える 1

1

私の質問に関連するstackoverflowで次の2つのリンクを見つけました。

Map-Reduce での二次ソート

MapReduce (二次) ソート/フィルタリング - どうやって?

運を試してみましょう。

于 2012-08-17T19:21:44.013 に答える