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