【发布时间】: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>
正则表达式(<a>.*?<\/a>) 应该提取所有只包含带有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;
它只返回第一个<a>asdhf</a>。根据 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:请提出一个新问题。我不知道你的上下文,可能与这个问题中的不同,所以我没有办法给你任何建议。