Hadoop Pig:读取多个文件并按列追加

Hadoop Pig:读取多个文件并按列追加,hadoop,join,left-join,apache-pig,Hadoop,Join,Left Join,Apache Pig,我想在猪身上实现这一点,但不确定是否有一种有效的方法。 我有一个带有标题的输入文件:COL1、COL2、COL3、COL4、TAG和多个值文件,所有这些文件都具有类似的格式TAG、value。我想将每个值文件的值列与基于标记的输入文件一起附加为键列。所以,若有3个值文件,那个么最终组合文件的格式将是COL1、COL2、COL3、COL4、TAG、VALUE1、VALUE2、VALUE3 我能想到的一种方法是读取每个值文件,然后以增量方式与输入文件连接。因此,我们将有多个中间文件。 和第一个使用一

我想在猪身上实现这一点,但不确定是否有一种有效的方法。 我有一个带有标题的输入文件:COL1、COL2、COL3、COL4、TAG和多个值文件,所有这些文件都具有类似的格式TAG、value。我想将每个值文件的值列与基于标记的输入文件一起附加为键列。所以,若有3个值文件,那个么最终组合文件的格式将是COL1、COL2、COL3、COL4、TAG、VALUE1、VALUE2、VALUE3

我能想到的一种方法是读取每个值文件,然后以增量方式与输入文件连接。因此,我们将有多个中间文件。 和第一个使用一个值文件连接输入文件一样,输出将是:COL1、COL2、COL3、COL4、TAG、VALUE1

现在,这将成为新的输入文件,并与另一个值文件联接,输出将是COL1、COL2、COL3、COL4、TAG、VALUE1、VALUE2


有更好的办法吗

您可以使用具有多个关系的COGROUP,它只会导致一个MR作业。以下代码未经测试即被键入,但这种想法应该可行:

header = LOAD 'header_path' using PigStorage(',') AS (COL1,COL2,COL3,COL4,TAG);
tv_1 = LOAD 'tv_1' using PigStorage(',') AS (TAG,VALUE);
tv_2 = LOAD 'tv_2' using PigStorage(',') AS (TAG,VALUE);
tv_3 = LOAD 'tv_3' using PigStorage(',') AS (TAG,VALUE);

joined = COGROUP header BY TAG, tv_1 BY TAG, tv_2 BY TAG, tv_3 BY TAG;

result = FOREACH joined GENERATE FLATTEN(header), FLATTEN((IsEmpty(tv_1) ? TOBAG(TOTUPLE(null) : tv_1.VALUE)) AS VALUE1, FLATTEN((IsEmpty(tv_2) ? TOBAG(TOTUPLE(null) : tv_2.VALUE)) AS VALUE2, FLATTEN((IsEmpty(tv_3) ? TOBAG(TOTUPLE(null) : tv_3.VALUE)) AS VALUE3; 

谢谢@alexeipab,为什么您更喜欢COGROUP而不是JOIN?多个关系上的JOIN不包括至少一个tv_X关系中不存在的头记录,并且据我所知,左外JOIN仅适用于双向JOIN。COGROUP允许保留所有头记录并部分模拟具有多个关系的外部联接,匹配标记不需要出现在所有标记值文件中,并且只使用一个MR作业。