5

すべての行に文字列、スペース、数字を含むファイルがあります。

例:

Line1: Word 2
Line2 : Word1 8
Line3: Word2 1

数値を降順で並べ替え、その結果を数値にランクを割り当てたファイルに入れる必要があります。したがって、私の出力は、次の形式を含むファイルである必要があります。

Line1: Word1 8 1
Line2: Word  2 2
Line3: Word2 1 3

誰にもアイデアがありますか?Hadoopでどうすればいいですか? Hadoop で Java を使用しています。

4

3 に答える 3

9

次のように map/reduce 計算を整理できます。

マップ入力: デフォルト

マップ出力: 「キー: 数値、値: 単語」

_ キーによるソートフェーズ _

ここでは、降順でソートするようにデフォルトのソーターをオーバーライドする必要があります。

リデュース - 1 リデューサー

入力を減らす: 「キー: 数字、値: 単語」

出力を減らします:「キー: 単語、値: (数値、ランク)」

グローバル カウンターを保持します。キーと値のペアごとに、カウンターをインクリメントしてランクを追加します。

編集:これは、カスタム子孫ソーターから切り取られたコードです:

public static class IntComparator extends WritableComparator {

    public IntComparator() {
        super(IntWritable.class);
    }

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

        Integer v1 = ByteBuffer.wrap(b1, s1, l1).getInt();
        Integer v2 = ByteBuffer.wrap(b2, s2, l2).getInt();

        return v1.compareTo(v2) * (-1);
    }
}

実際にジョブのコンパレーターとして設定することを忘れないでください:

job.setSortComparatorClass(IntComparator.class);
于 2011-11-27T22:28:47.243 に答える
5

Hadoop ストリーミング - Hadoop 1.0.x

これによると、

bin/hadoop jar contrib/streaming/hadoop-streaming-1.0.*.jar
  1. コンパレータを追加します

    -D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator

  2. 必要な並べ替えの種類を指定します

    -D mapred.text.key.comparator.options=-[オプション]

[オプション] は Unix のsortに似ています。下記は用例です、

逆順

-D mapred.text.key.comparator.options=-r

数値で並べ替え

-D mapred.text.key.comparator.options=-n

値または任意のフィールドで並べ替え

-D mapred.text.key.comparator.options=-kx,y

-k フラグを使用して、ソートのキーを指定します。x、y パラメータはこのキーを定義します。したがって、複数のトークンを含む行がある場合は、すべてのトークンのうちのどのトークンをソートのキーにするか、またはトークンのどの組み合わせをソートのキーにするかを選択できます。詳細と例については、参考文献を参照してください。

于 2012-08-20T09:59:40.697 に答える
2

この問題の解決策を考案しました。実は簡単でした。

値でソートするには、使用する必要があります

setOutputValueGroupingComparator(Class)

降順でソートするには、使用する必要がありますsetSortComparatorClass(LongWritable.DecreasingComparator.class);

Counter classランキングには、、getCounterおよびincrement関数を使用する必要が あります。

于 2012-02-03T18:16:02.783 に答える