Apache Hive正则表达式提取UDF

4

我在Apache Hive中遇到了一段代码,类似于regexp_extract(input, '[0-9]*', 0),请问这段代码是做什么的?谢谢。

3个回答

21
Hive手册DDL中,它返回使用模式提取的字符串。例如:regexp_extract('foothebar', 'foo(.*?)(bar)', 2) 返回barindex参数是捕获组,是一个可以取以下值的整数:
0:整个匹配,在我的例子中为foothebar 1:第一个组,在我的例子中为the 2:第二个组,在我的例子中为bar n:第n个组。如果n大于您的正则表达式中实际定义的组数,Hive查询将失败。
在您的示例中,regexp_extract(input, '[0-9]*', 0),您正在寻找由input标识的列的整个匹配项,并以数字值开头。
以下是一些示例:
  • regexp_extract('9eleven', '[0-9]*', 0) -> 返回 9
  • regexp_extract('9eleven', '[0-9]*', 1) -> 查询失败
  • regexp_extract('911test', '[0-9]*', 0) -> 返回 911
  • regexp_extract('911test', '[0-9]*', 1) -> 查询失败
  • regexp_extract('eleven', '[0-9]*', 0) -> 返回空字符串
  • regexp_extract('test911', '[0-9]*', 0) -> 返回空字符串

这是否意味着regexp_extract(input, '[0-9]*', 0)只匹配以数字开头的输入?谢谢。您能否举些例子? - user1653240
@user1653240,我在答案中添加了一些示例。 - Charles Menguy
为了概括一下,如果输入以一个或多个整数开头,则该函数将返回非空字符串? - user1653240
有没有办法使用相同的模式 [0-9]* 从 "55test911" 中获取 "55" 和 "911",例如 regexp_extract('55test911', '[0-9]*', X)?这应该可以使用全局标识符(例如 PHP)来完成,但如何在Hive中实现呢?我知道我可以使用另一种模式,但我想知道如何解决这个特定情况的问题 :-) - Enissay

3
上面的答案部分是不正确的。 regexp_extract('test911', '[0-9]*', 0) 确实会返回 911。 在 [0-9]* 之前,我们从未指定字符串的起始位置。

2
Please put it as a comment - mishik
在我们的Hive系统中,select regexp_extract('test911', '[0-9]*', 0); 返回空字符串。这并不奇怪,因为regexp_extract方法基于捕获组的概念,如果没有默认为给定正则表达式的第一个子字符串匹配。这里的正则表达式示例'[0-9]*'是零个或多个数字,并且该正则表达式在字符串的开头与零个数字匹配。有关所有细节,请查看源代码https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFRegExpExtract.java。 - Uwe Mayer

-1
正则表达式regexp_extract(input, '[0-9]*', 0)将返回输入字符串中的所有起始数字。
例如,
select regexp_extract('442323test41234', '[0-9]*', 0) ==> 442323
select regexp_extract('44test41234', '[0-9]*', 0) ==> 44
select regexp_extract('test41234', '[0-9]*', 0) ==> 1

但这并不是提取起始数字的最佳方式。以下格式更易读:

select regexp_extract(input, '^([0-9]+).*?$', 1)

以上正则表达式表示,列出字符串中以数字开头的所有数字,并忽略其余部分。

regexp_extract不返回“起始匹配项”,它使用Java的find()方法查找子字符串,无论它们出现在哪里。但是,它确实从输入字符串的开头开始搜索,也许这就是混淆的原因。您更易读的格式与其他格式不同,因为它使用“+”,因此寻找一个或多个数字,而其他正则表达式使用“*”并寻找零个或多个数字。最后,示例select regexp_extract('test41234', '[0-9]*', 0)返回空字符串而不是'1',请参见我对先前答案的评论。 - Uwe Mayer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接