0

次のファイルがあります。

City.dat

Andorra la Vella|ad|Andorra la Vella|20430|42.51|1.51|
Canillo|ad|Canillo|3292|42.57|1.6|
Encamp|ad|Encamp|11224|42.54|1.57|
...

国.dat

Andorra|ad|Andorra la Vella|Andorra la Vella|69865|468|
United Arab Emirates|ae|Abu Dhabi|Abu Dhabi|2523915|82880|
Afghanistan|af|Kabul|Kabul|28513677|647500|
...

Map Side Join を実行して、Country.dat ファイルにリストされている人口 (City.dat の列 4) と各首都の名前 (Country.dat の列 3) を取得する必要があります。それで基本的な考え方が分かります。両方のファイルの結合キーは都市の値になります (City.dat の列 1 と Country.dat の列 3)。このようにして、首都ごとに 1 行で必要なすべての情報を含むテーブルを取得する必要があります。

しかし、これは Hadoop でどのように機能するのでしょうか? 両方のファイルの結合キーを Hadoop に伝えるにはどうすればよいですか (まず、すべての行からそれを解析する必要がありますね?) 私が見つけたすべてのコードは、次のようになっていました。

inner(tbl(org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat.class,
          "/user/cloudera/City.dat"),
      tbl(org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat.class,
          "/user/cloudera/Country.dat"))

これは、結合されるはずの 2 つのファイルを定義するだけです。しかし、結合キーとレコードとして定義するものを定義するにはどうすればよいでしょうか (私の場合、各ファイルの 1 行がレコードになるはずです)。

4

2 に答える 2

0

いずれかのファイルを分散キャッシュとして渡し、もう一方のファイルを実際の入力として渡すことができます。

たとえばcountry.dat、両方のタイプの入力の中で小さい方が分散キャッシュにあるとします。

ここcountry.datで、configure メソッドまたは setup メソッド (それぞれ新しい API または古い API) でこれを読み取り、必要に応じて HashMap を作成し (首都にキーを設定)、後で必要に応じてこの HashMap を map メソッドで使用してレコードを結合します。

于 2012-12-13T19:34:28.143 に答える
0

基本的に map() メソッドはレコードを受け取り、それをコンテキストに書き込みます。キーは都市名と国名の連結であり、値はファイル 1 またはファイル 2 のどちらからのものであるかに関するいくつかの指示と連結されたファイルの行全体になります。Hadoop はその作業を行い、reduce() メソッドは次のようになりますマッパーに書き込んだ各キーと、そのキーの map() によって書き込まれたすべての値を含む Iterable を渡しました。基本的に、これは Iterable のファイル 1 とファイル 2 の行をソースのインジケーターとペアにします。あなたのロジックはそこからそれを取ります。

特定の質問に答えるには、マッパーの setup() メソッドでファイル 1 を読み取り、ファイルの内容を I'm memory としてハッシュ テーブルとして格納できます。その後、ファイル 2 の各行に対して map)( メソッドを呼び出すと、メモリ内のそのハッシュ テーブルにアクセスできます。欠点は、ファイルがメモリに収まるほど小さくなければならず、それぞれに対して setup() メソッドが呼び出されることです。入力スライス。

于 2012-11-05T15:41:25.507 に答える