限制,但不是Pig的顺序

gwbalxhn  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(193)

我在使用时遇到一个问题 Limit 在Pig身上。
结果 Limit 已排序,但我不希望结果被排序。
从网站上的例子来看:

A = LOAD 'data' AS (a1:int,a2:int,a3:int);

DUMP A;
(1,2,3)
(4,2,1)
(8,3,4)
(4,3,3)
(7,2,5)
(8,4,3)

使用 Limit ```
X = LIMIT A 3;

DUMP X;
(1,2,3)
(4,3,3)
(7,2,5)

有没有可能显示前三行而不在列表中排序?

(1,2,3)
(4,2,1)
(8,3,4)

我的代码如下:

A = LOAD '$input';
B = foreach A generate $s_field;
C = FILTER B BY $pattern;
D = FOREACH C {
topnresult = LIMIT B $lines;
GENERATE FLATTEN(topnresult);
}
dump D;

非常感谢你。
jucafojl

jucafojl1#

默认情况下,limit将在内部执行order命令,然后执行limit命令,因此显然您将得到排序的列表。有很多方法可以解决这个问题,其中一个选择是
输入文件

1       2       3
4       2       1
8       3       4
4       3       3
7       2       5
8       4       3

Pig手稿:

A = LOAD 'input.txt' AS (a1:int,a2:int,a3:int);
B = RANK A;
C = FILTER B BY rank_A<=3;
D = FOREACH C GENERATE a1,a2,a3;
DUMP D;

输出:

(1,2,3)
(4,2,1)
(8,3,4)

选项2:

A = LOAD 'input.txt' AS (a1:int,a2:int,a3:int);
B = GROUP A ALL;
C = FOREACH B {
                top3list =  LIMIT A 3;
                GENERATE FLATTEN(top3list);
              }
DUMP C;

输出:

(1,2,3)
(4,2,1)
(8,3,4)

更新:解决方案1

A = LOAD '$input';
B = foreach A generate $s_field;
C = FILTER B BY $pattern;
D = GROUP C ALL;
E = FOREACH D {
            topnresult = LIMIT C $lines;
            GENERATE FLATTEN(topnresult);
        }
DUMP E;

解决方案2:

A = LOAD '$input';
B = foreach A generate $s_field;
C = FILTER B BY $pattern;
D = RANK C;
E = FILTER D BY rank_C<=$lines;
F = FOREACH E GENERATE $1..;
DUMP F;

我已经用下面的命令行测试了这个解决方案,它运行良好

>pig -x local -param input='input.txt' -param s_field='$0,$1,$2' -param pattern='$0<10' -param lines=3 myscript.pig

相关问题