如何在pig中生成一定数量的元组?

Posted

技术标签:

【中文标题】如何在pig中生成一定数量的元组?【英文标题】:How to generate certain number of tuples in pig? 【发布时间】:2012-09-04 07:49:17 【问题描述】:

我有以下数据集:

答:

x1 y z1
x2 y z2
x3 y z3
x43 y z33
x4 y2 z4
x5 y2 z5
x6 y2 z6
x7 y2 z7

乙:

y 12
y2 25

加载 A: LOAD '$input' USING PigStorage() AS (k:chararray, m:chararray, n:chararray); 加载 B: LOAD '$input2' USING PigStorage() AS (o:chararray, p:int);

我在 m 上加入 A,在 o 上加入 B。我想做的是为每个 o 只选择 x 个元组。因此,例如,如果 x 为 2,则结果为:

x1 y z1
x2 y z2
x4 y2 z4
x5 y2 z5

【问题讨论】:

【参考方案1】:

为此,您需要使用带有嵌套 LIMIT 的 GROUP BY、FOREACH,而不是 JOIN 或 COGROUP。参见 Pig 0.10 中的实现,我使用你输入的数据来获得指定的输出:

A = load '~/pig/data/subset_join_A.dat' as (k:chararray, m:chararray, n:chararray);
B = load '~/pig/data/subset_join_B.dat' as (o:chararray, p:int);
-- as join will be on m, we need to leave only 2 rows per a value in m.
group_A = group A by m;
top_A_x = foreach group_A 
    top = limit A 2; -- where x = 2
    generate flatten(top);
;

-- another way to do join, allows us to do left or right joins and checks
co_join = cogroup top_A_x by (m), B by (o);
-- filter out records from A that are not in B
filter_join = filter co_join by IsEmpty(B) == false;
result = foreach filter_join generate flatten(top_A_x);

或者,您可以仅使用 COGROUP、FOREACH 和嵌套的 LIMIT 来实现它:

A = load '~/pig/data/subset_join_A.dat' as (k:chararray, m:chararray, n:chararray);
B = load '~/pig/data/subset_join_B.dat' as (o:chararray, p:int);

co_join = cogroup A by (m), B by (o);
filter_join = filter co_join by IsEmpty(B) == false;
result = foreach filter_join 
    top = limit A 2;
--you can limit B as well
    generate flatten(top);
;

【讨论】:

以上是关于如何在pig中生成一定数量的元组?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Pig 元组拆分为子元组?

元组中的元素到 Bag Pig 中的元组

如何解析具有不同键值数量的元组列表

如何计算SQL中特定值范围内不变的元组数量

使用 pig,如何将混合格式的行解析为元组和一袋元组?

如何使用 Pig 和 HBaseStorage 存储到 HBase