2

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

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

以下代码应提取测试“键”的字符串值:

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 '''

我以为我一开始就关闭了正则表达式转义语法,但这似乎不是问题。我从 Google 搜索中获得的唯一信息是一个似乎最近已修复的错误报告,但它仍然是我正在运行的 Amazon EMR 集群上的一个问题(为了进行分析,刚刚启动了 ad hoc)。

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

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

干杯

4

2 回答 2

1

这是一个将在 0.12 中修复的错误(请参阅http://issues.apache.org/jira/browse/PIG-2507

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

显然,您也可以通过应用补丁来构建自己的 pig 版本,但我想这有点复杂。

于 2013-04-16T18:06:07.440 回答
0

看起来您正在为 Pig 使用 Amazon 的字符串操作和 DateTime 函数,因为EXTRACT()它不是内置函数。

尝试切换到使用内置功能REGEX_EXTRACT_ALL()

于 2013-04-16T09:43:25.537 回答