关于EMR的猪:如何在EXTRACT函数的正则表达式参数中包含分号

时间:2013-04-16 04:53:26

标签: hadoop apache-pig amazon-emr emr

我正在使用Pig中的一些数据,其中包含感兴趣的字符串,可选地以分号和随机顺序分隔,例如

test=12345;foo=bar
test=12345
foo=bar;test=12345

以下代码应提取测试'key'的字符串值:

blah =
  FOREACH
    data
  GENERATE
    FLATTEN (
      EXTRACT (
        str_of_interest,
        'test=(\\S+);?'
      )
    )
    AS (
      test: chararray
    )
  ;

但是,在运行代码时,我遇到以下错误:

<line 46, column 0>  mismatched character '<EOF>' expecting '''
2013-04-16 04:46:05,245 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: <line 46, column 0>  mismatched character '<EOF>' expecting '''

我认为我首先关闭了正则表达式转义语法,但这似乎不是问题所在。我从谷歌搜索获得的唯一信息是bug report似乎最近已经修复,但它仍然是我正在运行的Amazon EMR集群上的一个问题(刚刚开始临时调整,用于此分析)。

如错误报告和其他地方所建议的那样,将分号替换为其等效的Unicode(\ u003B)会产生相同的错误。

我可能会疯狂,这可能是一个语法问题,所以我希望有人能够指出我正确的方向或确认这是一个存在的问题。如果是后者,是否有任何变通方法(在Pig中,或者匹配我想要的字符串)?

干杯

2 个答案:

答案 0 :(得分:1)

这是一个将在0.12(见http://issues.apache.org/jira/browse/PIG-2507

中修复的错误

如果您无法更改分隔符或等待发布新版本(在EMR上这可能需要比实际的Apache版本更长的时间),我将实现自己的UDF并以某种方式对正则表达式进行硬编码。您可以使用RegexExtract作为起点。

显然你也可以通过应用补丁建立你自己的猪版本,但我想这有点复杂。

答案 1 :(得分:0)

看起来你正在使用亚马逊的字符串操作和猪日期时间函数,因为EXTRACT()不是内置函数。

尝试切换到使用内置函数REGEX_EXTRACT_ALL()