11

次のような形式のユーザー アクティビティ データを含むタブ区切りファイルがあるとします。

timestamp  user_id  page_id  action_id

各ページでユーザー アクションをカウントする Hadoop ジョブを作成したいので、出力ファイルは次のようになります。

user_id  page_id  number_of_actions

ここでは、複合キーのようなものが必要です。これには、user_id と page_id が含まれます。Hadoopでこれを行う一般的な方法はありますか? 役立つものは何も見つかりませんでした。これまでのところ、マッパーで次のようなキーを発行しています:

context.write(new Text(user_id + "\t" + page_id), one);

動作しますが、最善の解決策ではないと感じています。

4

2 に答える 2

14

独自の を作成するだけWritableです。あなたの例では、ソリューションは次のようになります。

public class UserPageWritable implements WritableComparable<UserPageWritable> {

  private String userId;
  private String pageId;

  @Override
  public void readFields(DataInput in) throws IOException {
    userId = in.readUTF();
    pageId = in.readUTF();
  }

  @Override
  public void write(DataOutput out) throws IOException {
    out.writeUTF(userId);
    out.writeUTF(pageId);
  }

  @Override
  public int compareTo(UserPageWritable o) {
    return ComparisonChain.start().compare(userId, o.userId)
        .compare(pageId, o.pageId).result();
  }

}

ID は である可能性があると思いますがlong、ここにStringバージョンがあります。基本的には、Writableインターフェイスを介した通常のシリアル化だけです。デフォルトのコンストラクターが必要なため、常に提供する必要があることに注意してください。

ロジックは明らかにデータセットのcompareTo並べ替え方法を示し、どの要素が等しいかをレデューサーに伝えてグループ化できるようにします。

ComparisionChainGuavaの素晴らしいユーティリティです。

equals と hashcode をオーバーライドすることを忘れないでください。パーティショナーは、キーのハッシュコードによってレデューサーを決定します。

于 2012-09-14T16:17:17.020 に答える
1

2 つのフィールドを比較する Writable と WritableComparable を実装する独自のクラスを作成できます。

ピエール=リュック・ベルトラン

于 2012-09-14T16:12:01.543 に答える