仅从Hive中的字符串字段中提取数字

时间:2019-03-29 12:48:47

标签: regex hive

我在Hive中有一个非常简单的问题。我写了下面的摘录,它应该从字符串中返回“ 10”。当我在regexr上测试它时,它可以工作,但是在Hive中,它只是返回一个空白字段。

有人知道我在做什么错吗?

select REGEXP_EXTRACT('DOM_10GB_mth','/[0-9]*/g', 0)  

3 个答案:

答案 0 :(得分:1)

REGEXP_EXTRACT函数期望使用正则表达式 pattern 作为第二个参数。在线正则表达式测试器中的/字符表示正则表达式定界符,它们不属于正则表达式模式g部分是一个正则表达式 flag (用于匹配字符串中某个模式的多次出现),并且它也不是该模式的一部分。您只应将字符串模式传递给Hive regex函数。

另外,要提取一个或多个数字,可以使用[0-9]+而不是[0-9]*,因为*仅匹配0个或多个匹配项。

使用

select REGEXP_EXTRACT('DOM_10GB_mth','[0-9]+', 0) 

请参见this regex demo

请注意,在regexr或任何其他在线正则表达式测试器中,/[0-9]*/g 模式 would not work either

答案 1 :(得分:0)

当我将以上内容应用于字符串“ xyca3a032975b95285c6f10c8dbde6d9”时,没有得到正确的结果。知道为什么吗?

从双对中选择regexp_extract('xyca3a032975b95285c6f10c8dbde6d9','[0-9] +',0)作为res ;;

答案 2 :(得分:0)

要获取字符串中的所有数字,您必须删除所有不是数字的内容。使用这个函数来获取它:

select REGEXP_REPLACE('DOM_10GB_mth','[^0-9]+', "")

@Wiktor_Stribiżew 的回答只会返回第一个数字序列,因此如果您尝试从“111Z222”中获取数字,它将返回“111”。我的回答会返回“111222”。