regexp\u extract获取所有匹配项

nzrxty8p  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(603)

我正在查询中的列 hive . 此列包含 json 有效载荷和格式如下:

{"aaa":"xxx", "status":"yes", "bbb":"xyx", "ccc":"yxy", "status":"no", "status":"maybe", "ddd":"zyz"}

我试图提取在有效负载的不同点上出现的所有状态值。我正在使用以下命令: select regexp_extract (payload,'(?<=status":")(.*?)"') as Status 但是,这只返回第一次出现的状态,并且丢失所有下一次出现的状态。每次状态重复后如何获取值?
谢谢

wfveoks0

wfveoks01#

结合使用 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

zbdgwd5y

zbdgwd5y2#

我猜你这样做是因为json包含了错误的键。
正则表达式使用除 [^] 符号:

/"status":"([^"]*)"/g

它还将从“status”:“”收集空字符串,如果您只希望包含值的条目,请使用:

/"status":"([^"]+)"/g

当然,最原始最好的regex参考是 perldoc perlre : https://perldoc.perl.org/perlre.html

相关问题