如何连接三个表?

2ul0zpep  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(442)

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

身份证名称地点

1 aaa位置1
2 bbb地点2
表b:

id cid名称

11 aaa级
222桶
表c:

cid cname公司

第11页
22页p2
当我使用hadoopmapreduce连接表a和b时,我得到了输出

千伏

1 aaa地点11
2 bbb地点2 22
现在我想把表c和上面的输出连接起来,在这里我可以替换11-->p1。我如何解决这个问题?

ajsxfq5m

ajsxfq5m1#

我不认为你能一步一步地把三张table连起来。所以我认为你只需要另一个mr工作,它将把a,b的结果和c的结果结合起来。
我建议在用java编写mr之前使用hive或pig。

5lhxktic

5lhxktic2#

如果要连接map reduce上的两个数据集,常用的算法是:
要将每个数据集Map为重新排列字段并打开要连接到数据集键的字段,标记每个记录也很有用,以便(稍后在reduce阶段)区分此记录来自哪个数据集
将这些数据集合并为一个
为了减少数据集,由于键是要联接的字段,所以只需对分组数据执行联接即可
因此,如果您了解如何联接两个数据集,可以重复此操作以联接第三个数据集。
这种方法的缺点是,如果您的数据集中有一个是小字典,那么reduce阶段的reducer的数量将限制在该字典的大小上(实际上它们受到不同键空间大小的限制,而这些键空间的大小不超过字典的大小)

hts6caw3

hts6caw33#

可能最简单的解决方法就是使用@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(' ');

相关问题