如何获取 Pig Script 中的最后一个元素

Posted

技术标签:

【中文标题】如何获取 Pig Script 中的最后一个元素【英文标题】:How to get the last element in Pig Script 【发布时间】:2017-07-25 13:47:30 【问题描述】:

我想使用 pig 脚本获取一行的最后一个元素。我不能使用 $ 因为最后一个元素的索引不固定。我尝试使用正则表达式,但它不起作用。我尝试使用 $-1 来获取它,但它没有用。我只发布一个示例,因为我的实际文件包含更多 PID。

示例:

MSH|�~\&|LAB|LAB|HEATH|HEA-HEAL|20247||OU�R01|M1738000000001|P|2.3|||ER|ER|
PID|1|YXQ120185751001|YXQ120185751001||ELJKDP@#PDUB||19790615|F||| H LGGH VW��ZHVW FKHVWHU�SD�19380|||||||4002C340778A|000009561|ELJKDP@#PDUB19790615F

我想得到 PID 的最后一个值,即ELJKDP@#PDUB19790615F 为此我尝试了下面的代码,但它不起作用。

代码 1:

STOCK_A = LOAD '/user/rt/PARSED' USING PigStorage('|'); 
data = FILTER STOCK_A BY ($0 matches '.*PID.*'); 
MSH_DATA = FOREACH data GENERATE $2 AS id, $5 AS ame , $7 AS dob, $8 AS gender, $-1 AS rk;

代码 2:

STOCK_A = LOAD '/user/rt/PARSED' USING PigStorage('|'); 
data = FILTER STOCK_A BY ($0 matches '.*PID.*'); 
MSH_DATA = FOREACH data GENERATE $2 AS id, $5 AS ame , $7 AS dob, $8 AS gender, REGEX_EXTRACT(data,'\\s*(\\w+)$',1) AS rk;

代码 2 错误:

错误 org.apache.pig.tools.grunt.Grunt - 错误 1200:Pig 脚本失败 解析:无效的标量投影:数据:A 列需要从关系中投影出来才能用作 标量

请帮忙

【问题讨论】:

最好的办法是写一个UDF并传递整个记录并查找最后一个分隔符的索引|然后得到任何东西。 @inquisitive_mind 你能举个例子吗,这对我来说很容易。 如果它只是一个正则表达式,你可以这样做: ^PID\|.*\|(.*) 它将在最后一个 | 之后放入捕获组中的任何内容对于以 PID 开头的行 @sniperd 我使用了REGEX_EXTRACT('^PID\|.*\|(.*)'),但我得到了ERROR 1200: <line 6, column 108> Unexpected character '|' 这很奇怪。我想知道是否需要对猪进行特殊的逃逸? \ 应该转义 | 【参考方案1】:

这应该可以工作

REGEX_EXTRACT(data,'([^|]+$)',1) AS rk

[^|]+$ 匹配最后一个竖线字符右侧的所有内容。

【讨论】:

我试过你的方法我得到ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: Pig script failed to parse: <line 3, column 102> Invalid scalar projection: data : A column needs to be projected from a relation for it to be used as a scalar 您的关系中可能没有足够的列,因为您正在加载“|”作为分隔符。修改 MSH_DATA = FOREACH data GENERATE REGEX_EXTRACT(data,'\\s*(\\w+)$',1) AS rk;检查正则表达式是否有效。然后处理获取其他列。很可能对于某些行,您没有 $2、$5、$7、$8。这将是一个单独的问题,试图找出您收到错误的原因。跨度>

以上是关于如何获取 Pig Script 中的最后一个元素的主要内容,如果未能解决你的问题,请参考以下文章

jquery如何获取第一个或最后一个子元素

JS中如何获取数组中的一部分元素

Apache Pig - 如何获取多个包之间的匹配元素数量?

如何使用 PIG 加载文件夹中的每个文件?

PHP如何获取数组里元素的个数

Pig:将 FOREACH 运算符应用于包中的每个元素