0

我有一个包含三个表的大量数据,假设三个表的数据类似于:

表 A:

身份证名称地点

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 时,我得到了输出

千伏

1 个 aaa 位置 1 11
2 个 bbb 位置 2 22

现在我想用上面的输出加入表 C,我可以替换 11 --> p1。我该如何解决这个问题?

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 上连接两个数据集,常用算法是:

  • 将每个数据集映射到重新排列字段并将要加入的字段转换为数据集的键,标记每个记录以区分(稍后在减少阶段)该记录来自哪个数据集也很有用
  • 将这些数据集合并为一个
  • 减少数据集,因为关键是您要加入的字段 - 您只需要对分组数据执行联接

因此,如果您了解如何加入两个数据集,则可以重复此操作以加入第三个数据集。

这种方法的缺点是,如果您的数据集之一是小尺寸的字典,则 reduce 阶段的 reducer 的数量将被限制为该字典的大小(实际上它们受到不超过大小的不同键空间大小的限制词典)

于 2012-09-10T07:30:02.757 回答
0

我不认为你可以在一个 MR 步骤中加入 3 个表。所以我认为你只需要另一个 MR 工作,它将获取加入 A、B 的结果并将它们与 C 加入。
而且有点偏离 - 我建议在用 Java 编码 MR 之前使用 Hive 或 Pig。

于 2012-09-10T07:32:11.753 回答