Impala中的REGEXP_EXTRACT

时间:2018-06-29 11:40:18

标签: sql regex impala

我试图弄清楚如何从看起来像这样的字符串中提取客户ID:

{"param":"success","value":"10","level":"0","error_code":"101","customer_id":"5b0e9b23e423b0d33c9f7ddfd", "purchases": "13", "last_activity_ts": "123523465"}

我正在尝试从包含错误代码101的字符串中提取具有以下代码的客户ID:

select regexp_extract(field, '\"customer_id":"(.*)', 0) from table_name
where field rlike '"error_code":"101"'

但这给了我以下结果:

"customer_id":"5b0e9b23e423b0d33c9f7ddfd", "purchases": "13", "last_activity_ts": "123523465"}

预期结果:

5b0e9b23e423b0d33c9f7ddfd

您能帮我吗?

2 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式:

"customer_id":"([\w\d]+)"

演示:https://regex101.com/r/MEOGw8/1

测试:

{"param":"success","value":"10","level":"0","error_code":"101","customer_id":"5b0e9b23e423b0d33c9f7ddfd", "purchases": "13", "last_activity_ts": "123523465"}

匹配:

Match 1
Full match  63-104  `"customer_id":"5b0e9b23e423b0d33c9f7ddfd"`
Group 1.    78-103  `5b0e9b23e423b0d33c9f7ddfd`

SQL语句:

select regexp_extract(field, '"customer_id":"([\w\d]+)"',1, 1) from table_name
where field rlike '"error_code":"101"'

答案 1 :(得分:0)

您的正则表达式从"customer_id":"匹配到行尾,因为您使用.*,它将匹配任何字符零次或多次,并且您使用0作为{{的最后一个参数1}},它引用了整个提取的字符串。

要匹配双引号之间的内容,可以不匹配双引号,并使用否定的character class捕获regexp_extract.组中的引号:

"customer_id":"([^"]+)"

或者您可以在字符类中指定字符范围,将其重复一次或多次([^"]+)并将其捕获到一个组中:

"customer_id":"([a-f0-9]+)"

您的值在第一个捕获组中,我认为您可以使用([a-f0-9]+)作为regexp_extract的第三个参数来指定。

1