【问题标题】:regexp_extract hive not working as expectedregexp_extract 配置单元未按预期工作
【发布时间】:2015-06-26 09:32:52
【问题描述】:

我开始使用 hive 进行一些数据准备,但在使用 regexp_extract udf 时遇到了一个特殊问题。我正在研究 XML 结构,并且正在尝试从 XML 字符串中提取一些元素。 这是一个例子。我正在操作的字符串是:

<b>ajsdnf</b>
<a>asdhf</a>
<a>alfnv</a>
<b>ajsdnf</b>
<a>test</a>

正则表达式(&lt;a&gt;.*?&lt;\/a&gt;) 应该提取所有只包含带有a 标签的元素的字符串。当我在regex101 上检查我的逻辑时,它会找到所有正确的组。

但是当我像这样对蜂巢运行它时

select regexp_extract('<b>ajsdnf</b><a>asdhf</a><a>alfnv</a><b>ajsdnf</b><a>test</a>','(<a>.*?<\/a>)',0) from some_table limit 1;

它只返回第一个&lt;a&gt;asdhf&lt;/a&gt;。根据 regex_extract 的文档,如果我将整数 0 作为第三个参数传递,它应该返回所有出现的事件。有没有机会我可以达到以下结果

<a>asdhf</a>
<a>alfnv</a>
<a>test</a>

如果您想知道为什么我不使用 xpath 来处理这个 XML 问题,我的结构要复杂得多,并且想要提取 XML 树的某些部分,包括它们的所有子节点。这是 hive 的 xpath udfs 目前无法处理的。

【问题讨论】:

  • 如果你删除limit 1会发生什么?
  • regexp_extract 不能那样工作。它只匹配一次。除非您知道匹配的数量,否则 regexp_extract 不起作用。你可能想看看这个:qnalist.com/questions/4957014/…
  • 此线程link 中的答案建议索引0 应返回所有匹配的组。我哪里错了?
  • @nhahtdh 我按照链接关注,但它返回不匹配的字符串..
  • @Prashanth:请提出一个新问题。我不知道你的上下文,可能与这个问题中的不同,所以我没有办法给你任何建议。

标签: regex hive


【解决方案1】:
select regexp_replace('<b>ajsdnf</b><a>a<b>aksdhf</b>dhf</a><a>alfnv</a><b>ajsdnf</b><a>test</a>','(.*?)(<a>.*?<\/a>)(.*?)','$2') from some_tablelimit 1;

这成功了。感谢 nhahtdh 的建议

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2018-09-23
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多