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(' ');
3条答案
按热度按时间ajsxfq5m1#
我不认为你能一步一步地把三张table连起来。所以我认为你只需要另一个mr工作,它将把a,b的结果和c的结果结合起来。
我建议在用java编写mr之前使用hive或pig。
5lhxktic2#
如果要连接map reduce上的两个数据集,常用的算法是:
要将每个数据集Map为重新排列字段并打开要连接到数据集键的字段,标记每个记录也很有用,以便(稍后在reduce阶段)区分此记录来自哪个数据集
将这些数据集合并为一个
为了减少数据集,由于键是要联接的字段,所以只需对分组数据执行联接即可
因此,如果您了解如何联接两个数据集,可以重复此操作以联接第三个数据集。
这种方法的缺点是,如果您的数据集中有一个是小字典,那么reduce阶段的reducer的数量将限制在该字典的大小上(实际上它们受到不同键空间大小的限制,而这些键空间的大小不超过字典的大小)
hts6caw33#
可能最简单的解决方法就是使用@david提到的pig。对于快速测试,您会得出如下结果: