Apache Pig - 如何提取记录集

Posted

技术标签:

【中文标题】Apache Pig - 如何提取记录集【英文标题】:Apache Pig - How to extract sets of records 【发布时间】:2015-04-21 10:18:01 【问题描述】:

我是 Apache Pig 的新用户,我有以下数据

order=0012,1,23  
order=0013,2,34,0015,1,45  
order=0011,1,456
...  

我试图提取到下面的记录

0012,1,23
0013,2,34
0015,1,45
0011,1,456
...  

以下是我尝试过的代码

a = LOAD 'a.txt' Using TextLoader() AS (line:chararray);  
b = FOREACH a GENERATE FLATTEN(REGEX_EXTRACT_ALL(line, 'order=((\\d+),(\\d+),(\\d+))+')) AS
(
    order_item:chararray,
    order_pid: chararray,
    order_qty: chararray,
    order_price: chararray
);

它不起作用。 另一个尝试保存到包中:

a = LOAD 'a.txt' Using TextLoader() AS (line:chararray);  
b = FOREACH a GENERATE FLATTEN(REGEX_EXTRACT_ALL(line, 'order=((\\d+),(\\d+),(\\d+))+')) AS
(
    B: bag  T: tuple(
    order_pid: chararray,
    order_qty: chararray,
    order_price: char array
    )
);

还是不行。

【问题讨论】:

您好 jurgemaister,感谢您的提醒,对不起,我也是堆栈溢出的新手。 【参考方案1】:

你可以试试这个吗?

输入:

order=0012,1,23
order=0013,2,34,0015,1,45
order=0011,1,456

PigScript:

A = LOAD 'input' AS (line:chararray);
B = FOREACH A GENERATE FLATTEN(STRSPLIT(REGEX_EXTRACT(line,'order=(.*)',1),','));
C = FOREACH B GENERATE FLATTEN(TOBAG(TOTUPLE($0..$2),TOTUPLE($3..$5)));
D = FILTER C BY $0 is not null;
DUMP D;

输出:

(0012,1,23)
(0013,2,34)
(0015,1,45)
(0011,1,456)

【讨论】:

我试过了,它适用于上述示例。但是,如果我不知道 order== 之后有多少(项目、数量、价格),是否可以使其更通用? 如果你不知道前期有多少项目,那么使用原生pig很难解决这个问题。你必须去自定义UDF。 pig.apache.org/docs/r0.13.0/udf.html

以上是关于Apache Pig - 如何提取记录集的主要内容,如果未能解决你的问题,请参考以下文章

Hive Pig 反连接

如何在 Pig 中动态获取组内的前 N% 记录

当键分为列时,如何在 Apache Pig 中加入两个商店?

Apache PIG:将一个数据集附加到另一个数据集

Apache PIG - 如何获取 Flop 10 数据记录?

使用 Apache Hadoop Pig 内连接两个数据集