我想在Pig中实现这一点但不确定一种有效的方法。
我有一个输入文件(带有标题:COL1,COL2,COL3,COL4,TAG)和多个具有相似格式(TAG,VALUE)的“值”文件。我想将每个“value”文件的“VALUE”列附加到基于“TAG”作为键列的输入文件。因此,如果有3个“值”文件,则最终组合文件的格式将为(COL1,COL2,COL3,COL4,TAG,VALUE1,VALUE2,VALUE3)。
我能想到的一种方法是读取每个“值”文件,然后以递增方式连接输入文件。所以我们将有多个中间文件。 就像第一次使用一个值文件连接输入文件一样,输出将是:COL1,COL2,COL3,COL4,TAG,VALUE1。
现在这成为新的输入文件并与另一个“值”文件连接,输出将是COL1,COL2,COL3,COL4,TAG,VALUE1,VALUE2。
有更好的方法吗?
答案 0 :(得分:0)
您可以将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;