我想在Pig中实现此目标,但不确定有效的方法。
我有一个输入文件( header :COL1,COL2,COL3,COL4,TAG)和多个“值”文件,它们的格式都相似(TAG,VALUE)。我想将每个“值”文件的“值”列附加到基于“TAG”作为键列的输入文件中。因此,如果有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;
关于hadoop - Pig:读取多个文件并逐列追加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32296719/