如何在Hive中用regexp_extract提取JSON payload所有status值?
提取Hive JSON Payload中所有重复的status值
嘿,我懂你的困扰——regexp_extract确实只会返回第一个匹配到的status值,要把所有出现的结果都捞出来,得换个思路,给你两个实用的方案:
方案1:正则替换+拆分+展开(兼容大部分Hive版本)
如果你的Hive版本偏旧(低于2.1.0),可以组合regexp_replace、split和explode来实现:
SELECT explode(split(regexp_replace(payload, '.*?"status":"([^"]+)".*?', '$1,'), ',')) AS Status FROM your_table WHERE payload LIKE '%"status"%' -- 过滤掉不含status的行 HAVING Status != '' -- 剔除拆分后可能出现的空字符串
原理说明:
regexp_replace(payload, '.*?"status":"([^"]+)".*?', '$1,'):捕获每个匹配到的status值,替换成「值+逗号」的格式,最终得到类似success,failed,pending,的字符串split(..., ','):把拼接后的字符串按逗号拆分成数组explode(...):将数组中的每个元素转为单独的行- 最后加
HAVING Status != ''是为了处理字符串末尾逗号导致的空元素
方案2:用regexp_extract_all(Hive 2.1.0及以上推荐)
Hive 2.1.0及以上版本提供了regexp_extract_all函数,它会直接返回所有匹配到的结果数组,用法更简洁:
SELECT explode(regexp_extract_all(payload, '(?<=status":")([^"]+)', 0)) AS Status FROM your_table WHERE payload LIKE '%"status"%'
原理说明:
regexp_extract_all(payload, '(?<=status":")([^"]+)', 0):第二个参数是匹配正则,第三个参数0表示返回所有匹配的分组结果,直接得到包含所有status值的数组explode(...):把数组展开成多行,每个status值占一行
额外提醒:
如果你的JSON是标准的数组嵌套结构(比如[{"status":"a"},{"status":"b"}]),用JSON专用函数会更可靠,示例如下:
SELECT get_json_object(item, '$.status') AS Status FROM your_table LATERAL VIEW explode(split(get_json_object(payload, '$[*]'), '},\\{')) temp AS item WHERE payload LIKE '%"status"%'
但如果status分散在JSON的不同层级或无规律位置,正则的方法还是更灵活。
内容的提问来源于stack exchange,提问作者Valerie
相关产品推荐
相关产品推荐

