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

Posted

技术标签:

【中文标题】Pig:读取多个文件并逐列追加【英文标题】:Pig: Read multiple files and append column-wise 【发布时间】:2015-08-30 12:47:43 【问题描述】:

我想在 Pig 中实现这一点,但不确定一种有效的方法。 我有一个输入文件(带有标题: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。

有没有更好的方法?

【问题讨论】:

【参考方案1】:

您可以将 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? 多个关系上的联接将不包括至少一个 tv_X 关系中不存在的标头记录,据我所知,左外部联接仅适用于 2 路联接。 COGROUP 允许保留所有标头记录并部分模拟具有多个关系的 OUTER 连接,匹配的 TAG 不需要出现在所有标记值文件中并且只使用一个 MR 作业。

以上是关于Pig:读取多个文件并逐列追加的主要内容,如果未能解决你的问题,请参考以下文章

宏从一张表中逐列复制并粘贴到主表中,以保持不断增长的数据

逐列选择值的平均值

python 熊猫逐列归一化

JPA忽略逐列值映射

逐列匹配展平R数据帧中的行

逐列矩阵元素的向量种群