regexp_extract 配置单元未按预期工作

Posted

技术标签:

【中文标题】regexp_extract 配置单元未按预期工作【英文标题】:regexp_extract hive not working as expected 【发布时间】: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:请提出一个新问题。我不知道你的上下文,可能与这个问题中的不同,所以我没有办法给你任何建议。 【参考方案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 的建议

【讨论】:

以上是关于regexp_extract 配置单元未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 高度内的 UITableView 未按预期工作

自动填充在 Excel 中未按预期工作

自动布局约束未按预期工作

CollectionView estimatedItemSize 未按预期工作

UITableViewCell 未按预期显示约束

Spring Security 配置 anyRequest().authenticated() 未按预期工作