regexp_extract 获取所有匹配项
regexp_extract get all matches
我正在查询 hive
中的列。
此列包含 json
有效负载,格式如下:
{"aaa":"xxx", "status":"yes", "bbb":"xyx", "ccc":"yxy", "status":"no", "status":"maybe", "ddd":"zyz"}
我正在尝试提取出现在负载不同点的所有状态值。
我正在使用以下内容:
select regexp_extract (payload,'(?<=status":")(.*?)"') as Status
然而,这只是 returns 状态的第一次出现,并且缺少所有下一个。每次 Status 重复后如何获取值?
谢谢
我猜你这样做是因为 json 格式错误,包含重复的键。
使用 anything-but [^abc]
表示法的正则表达式:
/"status":"([^"]*)"/g
这也会从 "status":"" 中收集空字符串,如果您只想要包含值的条目,请使用:
/"status":"([^"]+)"/g
原始和最好的正则表达式参考当然是 perldoc perlre
:
https://perldoc.perl.org/perlre.html
使用 REGEXP_REPLACE
、SPLIT,EXPLODE
和 get_json_object()
的组合
SELECT *
FROM (
SELECT get_json_object(r, '$.status') AS STATUS
FROM yourtable t
LATERAL VIEW explode(split(regexp_replace(t.payload, ',', '},{'), ',')) t1 AS r
) a
WHERE STATUS IS NOT NULL;
这给了
status
yes
no
maybe
我正在查询 hive
中的列。
此列包含 json
有效负载,格式如下:
{"aaa":"xxx", "status":"yes", "bbb":"xyx", "ccc":"yxy", "status":"no", "status":"maybe", "ddd":"zyz"}
我正在尝试提取出现在负载不同点的所有状态值。 我正在使用以下内容:
select regexp_extract (payload,'(?<=status":")(.*?)"') as Status
然而,这只是 returns 状态的第一次出现,并且缺少所有下一个。每次 Status 重复后如何获取值?
谢谢
我猜你这样做是因为 json 格式错误,包含重复的键。
使用 anything-but [^abc]
表示法的正则表达式:
/"status":"([^"]*)"/g
这也会从 "status":"" 中收集空字符串,如果您只想要包含值的条目,请使用:
/"status":"([^"]+)"/g
原始和最好的正则表达式参考当然是 perldoc perlre
:
https://perldoc.perl.org/perlre.html
使用 REGEXP_REPLACE
、SPLIT,EXPLODE
和 get_json_object()
SELECT *
FROM (
SELECT get_json_object(r, '$.status') AS STATUS
FROM yourtable t
LATERAL VIEW explode(split(regexp_replace(t.payload, ',', '},{'), ',')) t1 AS r
) a
WHERE STATUS IS NOT NULL;
这给了
status
yes
no
maybe