hadoop - Pig:读取多个文件并逐列追加

标签 hadoop join left-join apache-pig

我想在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/

相关文章:

Mysql - 如何连接 2 个表并仅在满足条件时保留匹配行

使用 JOIN 运算符进行 MySQL 查询

MYSQL LEFT JOIN 和 COUNT 和 GROUP BY

MySQL where JOIN 中的条件返回太多行

java - 来自 Java 代码的工作流程暂停

python - 为什么配置单元试图在 hdfs 中写入/用户?

MySQL:在 View 中选择?

oracle - 从Oracle压缩数据到配置单元错误

hadoop - 使用 Distcp 在 Hadoop 中提取数据

R数据.表: In-memory left join multiple columns from left and right side