0

3 つのテーブルに次のようなデータがあると仮定すると、3 つのテーブルを持つ膨大なデータ セットがあります。

表 A:

ID名の場所

1 aaa 位 1
2 bbb 位 2

表 B:

Id cId 名

1 11 aaa
2 22 bbb

表 C:

cId cname

11 p1
22 p2

Hadoop mapreduce を使用してテーブル A と B を結合すると、出力が得られます

kv

1 aaa 位 1 11
2 bbb 位 2 22

ここで、11 --> p1 を置き換えることができる上記の出力をテーブル C に結合したいと思います。この問題を解決するにはどうすればよいですか?

4

3 に答える 3

1

おそらく最も簡単な解決策は、@ David が述べたようにPigを使用することです。簡単なテストのために、次のようなものを考え出します:

TABLE_A = LOAD 'hdfs://my_path/input/table_a.txt' using PigStorage(' ') AS (
            id:chararray, 
            name:chararray, 
            place:chararray
          );

TABLE_B = LOAD 'hdfs://my_path/input/table_b.txt' using PigStorage(' ') AS (
            id:chararray, 
            cid:chararray, 
            name:chararray
          );

TABLE_C = LOAD 'hdfs://my_path/input/table_c.txt' using PigStorage(' ') AS (
            cid:chararray, 
            cname:chararray
          );

TMP = FOREACH (join TABLE_A by id, TABLE_B by id) GENERATE 
        TABLE_A::id as id, 
        TABLE_A::name as name, 
        TABLE_A::place as place, 
        TABLE_B::cid as cid;


JOIN_ABC = FOREACH (join TMP by cid, TABLE_C by cid) GENERATE 
             TMP::id, 
             TMP::name, 
             TMP::place, 
             TABLE_C::cname;

store JOIN_ABC into 'hdfs://my_path/output' using PigStorage(' ');
于 2012-09-10T08:13:31.073 に答える
0

map reduce で 2 つのデータセットを結合する場合の一般的なアルゴリズムは次のとおりです。

  • 各データセットをマップしてフィールドを再配置し、結合するフィールドをデータセットのキーに変換します。また、各レコードをマークして、このレコードがどのデータセットからのものであるかを区別するためにも役立ちます (後で削減段階で)。
  • これらのデータセットを 1 つに連結する
  • キーは結合するフィールドであるため、データセットを削減するには-必要なのはグループ化されたデータで結合を実行することだけです

したがって、2 つのデータセットを結合する方法を理解していれば、この操作を繰り返して 3 つ目のデータセットを結合できます。

このようなアプローチの欠点は、データセットの 1 つが小さなサイズのディクショナリである場合、reduce ステージのレデューサーの数がそのディクショナリのサイズに制限されることです (実際には、サイズを超えないさまざまなキー空間のサイズによって制限されます)。辞書)

于 2012-09-10T07:30:02.757 に答える
0

1 つの MR ステップで 3 つのテーブルを結合できるとは思いません。したがって、結合されたA、Bの結果を取り、それらをCと結合する別のMRジョブが必要だと思います。
少しオフです-JavaでMRをコーディングする前に、HiveまたはPigを使用することをお勧めします。

于 2012-09-10T07:32:11.753 に答える