Hive 基本教程

Hive SQL

Hive 笔记

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/hive-sql-str_to_map-function.html

Hive SQL 字符串转 map 或 json 函数 STR_TO_MAP 详解

Hive SQL 内置函数全解 Hive SQL 内置函数全解


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_namefeature_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
;

如上,利用了 CONCATCOLLECT_SETCONCAT_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