我正在查询中的列 hive
. 此列包含 json
有效载荷和格式如下:
{"aaa":"xxx", "status":"yes", "bbb":"xyx", "ccc":"yxy", "status":"no", "status":"maybe", "ddd":"zyz"}
我试图提取在有效负载的不同点上出现的所有状态值。我正在使用以下命令: select regexp_extract (payload,'(?<=status":")(.*?)"') as Status
但是,这只返回第一次出现的状态,并且丢失所有下一次出现的状态。每次状态重复后如何获取值?
谢谢
2条答案
按热度按时间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
zbdgwd5y2#
我猜你这样做是因为json包含了错误的键。
正则表达式使用除
[^]
符号:它还将从“status”:“”收集空字符串,如果您只希望包含值的条目,请使用:
当然,最原始最好的regex参考是
perldoc perlre
: https://perldoc.perl.org/perlre.html