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 perlrehttps://perldoc.perl.org/perlre.html

使用 REGEXP_REPLACESPLIT,EXPLODEget_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