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

Posted

技术标签:

【中文标题】EMR 上的猪:如何在 EXTRACT 函数的正则表达式参数中包含分号【英文标题】:Pig on EMR: how to include semicolon in regex argument of EXTRACT function 【发布时间】:2013-04-16 04:53:25 【问题描述】:

我正在处理 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 '''

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

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

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

干杯

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

谢谢,弗雷德。我还 ping 了 pig 用户邮件列表,该错误仍然存​​在。 UDF 成功了!【参考方案2】:

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

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

【讨论】:

EXTRACT() 函数包含在“piggybank”中,它是一组社区 UDF (cwiki.apache.org/PIG/piggybank.html)。我在使用该功能之前注册了这个 jar。使用 REGEX_EXTRACT_ALL() 和其他函数时,问题似乎仍然存在。 好的。您是否尝试在 REGEX_EXTRACT_ALL() 中使用 \u003B 而不是分号? 可能是你偶然发现了这个错误:issues.apache.org/jira/browse/PIG-2507

以上是关于EMR 上的猪:如何在 EXTRACT 函数的正则表达式参数中包含分号的主要内容,如果未能解决你的问题,请参考以下文章

amazon emr pig:使用参数文件

如何在 aws emr 上使用 -t ColumnMapKeyPrune 启动猪

如何从 Lambda 函数在亚马逊 EMR 上执行 spark 提交?

read_gbq 函数中 REGEXP_EXTRACT 中的正则表达式失败

猪用户定义函数中的 aws Amazon S3 客户端凭证

大数据之Hive:regexp_extract函数