【问题标题】:Apache Pig : Append two data sets to oneApache Pig:将两个数据集附加到一个
【发布时间】:2014-09-01 14:26:17
【问题描述】:

我有两个数据集

第一组A

(111)

(222)

(555)

第二组B

(333)

(444)

(666)

我做到了 C = 联合 A,B;

附加两个数据集后输出应该是第一个数据集和下一个第二个数据集

预期输出 C 是

(111)

(222)

(555)

(333)

(444)

(666)

但我的输出 C 是

(333)

(444)

(666)

(111)

(222)

(555)

如果我应用联合,则结果不正确 我很难按固定顺序附加它们 我怎样才能做到这一点 ? 我想不出任何帮助,但我们将不胜感激。

【问题讨论】:

  • 试试ORDER。为此,您必须包含键 A 和 B 才能对它们进行排序
  • 感谢您的评论,我在集合 A 和 B 中只有一列,输出不应该是行的顺序,它应该是集合的顺序,就像集合 A 的所有行都应该出现第一组和第二组 B 行我找不到任何解决方案。

标签: apache-pig union


【解决方案1】:

我尝试了经典的联合,对我来说数据保持有序。

但是,如果没有,我们就尝试强制它:)

正如我在之前的评论中所说的那样,它效率不高,但可以胜任。

--In order to determine nbA you can run the following cmd in the shell : wc -l A.txt
%default nbA 3

A = LOAD 'A.txt' USING PigStorage() AS (a:int);
B = LOAD 'B.txt' USING PigStorage() AS (b:int);

A = RANK A;
B = RANK B;

--DESCRIBE B; 
B = FOREACH B GENERATE rank_B + $nbA, $1;

C= UNION B,A;
C= ORDER C BY $0;
C= FOREACH C GENERATE $1; --If you want to drop the first column
DUMP C;

输出:

(111)
(222)
(555)
(333)
(444)
(666)

地点:

A.txt

111
222
555

和 B.txt:

333
444
666

【讨论】:

    【解决方案2】:

    为每个给出 file_number 的文件添加一个额外的列,然后合并修改后的数据集,然后根据给出 'file_number' 的列进行排序

    A = LOAD 'A.txt' USING PigStorage() AS (a:int);
    B = LOAD 'B.txt' USING PigStorage() AS (b:int);
    A_mod = FOREACH A GENERATE a, 1 AS file_number;
    B_mod = FOREACH A GENERATE b, 2 AS file_number;
    unified_mod = UNION A_mod, B_mod;
    output = SORT unified_mod BY file_number;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多