如何获取 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 中的最后一个元素的主要内容,如果未能解决你的问题,请参考以下文章