Hive SQL 中将字符串转成 MAP 格式(也可以当成 JSON)的函数是 STR_TO_MAP
,它使用两个分隔符将文本拆分为键值对(KV),分隔符1和分隔符2默认分别为",
"和"=
",也可以指定两个分隔符。
语法说明
语法
STR_TO_MAP(text[, delimiter1, delimiter2])
说明
STR_TO_MAP
函数使用两个分隔符将文本拆分为键值对。delimiter1
将文本分成 K-V 对,delimiter2
分割每个 K-V 对。对于 delimiter1,默认分隔符是",
",对于 delimiter2 默认分隔符是"=
"。
如果需要指定分隔符,必须指定两个分隔符。
返回
STR_TO_MAP
函数返回的是 Map<String, String>
类型,不存在其它 MAP 类型,如 Map<String, Int>
此类。
常用例子
字符串解析成 json 格式
SELECT STR_TO_MAP('knowledge:18&dict:8','&',':')
;
先将指定字符串按照第一个分隔符"&
"分隔,再将每个 item 再用":
"分隔成键值对,最后输出如下 Map<String, String>
:
{"knowledge":"18","dict":"8"}
多个字段组合成 json 格式数据
假设 hive 有用户特征表 dwd_user_feature
,表结构如下:
uid bigint,
feature_name string,
feature_value string
希望将 uid
做聚合,并将 feature_name
和 feature_value
作为键值对映射,示例如下:
SELECT uid
,STR_TO_MAP(CONCAT_WS(',',COLLECT_SET(CONCAT(feature_name,':',feature_value))),',',':')
,COUNT(1) AS num
FROM soyoung_recommend.dwd_user_feature
WHERE dp = '2022-10-28'
GROUP BY uid
;
如上,利用了 CONCAT
、COLLECT_SET
、CONCAT_WS
函数,输出示例如下:
uid _c1 num 11 "{"uid__post_detail_view_90":"12","uid__last_log_in_date":"2022-10-28","uid__pm2_cnt_90":"15","uid__product_detail_view_90":"30"}" 4 21 "{"uid__post_detail_view_90":"305","uid__last_log_in_date":"2022-08-23","uid__product_detail_view_90":"3"}" 3 41 "{"uid__last_log_in_date":"2022-10-28","uid__post_detail_view_90":"24","uid__product_detail_view_90":"41"}" 3 89 "{"uid__last_log_in_date":"2022-07-29"}" 1