Regex 如何获取Pig脚本中的最后一个元素

Regex 如何获取Pig脚本中的最后一个元素,regex,apache-pig,hl7,Regex,Apache Pig,Hl7,我想使用pig脚本获取行的最后一个元素。我不能使用$,因为最后一个元素的索引不是固定的。我尝试使用正则表达式,但它不起作用。我尝试使用$-1来获取它,但没有成功。我只发布了一个样本,因为我的实际文件包含更多的PID 示例: MSH|�~\&|LAB|LAB|HEATH|HEA-HEAL|20247||OU�R01|M1738000000001|P|2.3|||ER|ER| PID|1|YXQ120185751001|YXQ120185751001||ELJKDP@#PDUB||19790

我想使用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
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;
我想得到PID的最后一个值i;e
ELJKDP@#PDUB19790615F
为此,我尝试了下面的代码,但它不起作用

代码1:

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
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的错误:

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
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;
错误org.apache.pig.tools.grunt.grunt-错误1200:pig脚本失败 要分析:无效的标量投影:数据:A 列需要从关系中投影才能用作 标量

请帮助

这应该行得通

REGEX_EXTRACT(data,'([^|]+$)',1) AS rk
[^ |]+$匹配最后一个管道字符右侧的所有内容


你最好的办法是写一个自定义项,通过整个记录,查找最后一个分隔符的索引,然后再获取任何内容。@好奇的人,你能举个例子吗?这对我来说很容易。如果它只是一个正则表达式,你可以这样做:^PID\\.*.\\(*)这将使捕获组在最后一行(以开头的行)之后加入任何内容PID@sniperd我使用了
REGEX|u EXTRACT(“^PID\|.*\|(.*)”
但是我得到了
错误1200:意外字符“|”
这很奇怪。我想知道猪是否需要一些特殊的逃跑方式?\应该避开|我尝试了你的方式我得到了
错误org.apache.pig.tools.grunt.grunt-错误1200:pig脚本未能解析:无效的标量投影:数据:需要从关系中投影一列,才能将其用作标量
您的关系中可能没有足够的列,因为您正在使用“|”加载作为分隔符。Modify MSH_DATA=FOREACH DATA生成REGEX_EXTRACT(数据“\\s*(\\w+$”,1)作为rk;检查正则表达式是否有效。然后获取其他列。很可能对于某些行,您没有$2、$5、$7、$8。这将是一个单独的问题,试图找出出现错误的原因。