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

polhcujo  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(252)

我想在Pig身上实现这一点,但不确定是否有一个有效的方法。我有一个输入文件(标题:col1,col2,col3,col4,tag)和多个“value”文件,所有这些文件的格式都相似(tag,value)。我想将每个“value”文件的“value”列与基于“tag”的输入文件作为键列附加在一起。因此,如果有3个“值”文件,那么最终组合文件的格式将是(col1、col2、col3、col4、tag、value1、value2、value3)。
我能想到的一种方法是读取每个“值”文件,然后以增量方式与输入文件连接。所以我们会有多个中间文件。就像第一个用一个值连接输入文件一样,输出将是:col1,col2,col3,col4,tag,value1。
现在它变成了新的输入文件,并与另一个“value”文件连接,输出将是col1、col2、col3、col4、tag、value1、value2。
有更好的办法吗?

bcs8qyzn

bcs8qyzn1#

您可以使用具有多个关系的cogroup,它只会导致一个mr job。以下代码是未经测试就输入的,但这个想法应该是可行的:

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;

相关问题