hive复杂数据类型map/struct用法实例

文章介绍了一种使用HiveSQL对商品属性进行处理的方法,通过collect_set、str_to_map、concat_ws等函数将多个属性聚合到一起,然后利用array_contains和if函数从映射中提取和填充缺失值,最终形成每个商品SKU的一条完整属性记录。

遇到一个有意思的数据处理问题,需要将商品的所有属性获取出来,然后每个商品一条记录,将其所有属性跟在SKU-ID后面,按列平铺展出。

1、原数据示例:

2、处理数据的SQL代码,用到了collect_set、 concat_ws、str_to_map、 array_contains(map_keys(col_name), key, value1) 、if(条件, value1, value2) 这几种函数方法的组合。如下:

SELECT
	b.cate_id,
	b.sku_id,
	b.包装,
	b.包装形式,
	b.国产进口,
	b.类型,
	b.使用方法,
	b.适用人群,
	b.适用性别,
	b.适用症状
FROM
	(
		SELECT
			a.cate_id,
			a.sku_id,
			IF(array_contains(map_keys(com_attr_map), "包装"), com_attr_map["包装"], "未知") AS 包装,
			IF(array_contains(map_keys(com_attr_map), "国产进口"), com_attr_map["国产进口"], "未知") AS 国产进口,
			IF(array_contains(map_keys(com_attr_map), "类型"), com_attr_map["类型"], "未知") AS "类型",
			IF(array_contains(map_keys(com_attr_map), "使用方法"), com_attr_map["使用方法"], "未知") AS "使用方法",
			IF(array_contains(map_keys(com_attr_map), "适用人群"), com_attr_map["适用人群"], "未知") AS "适用人群",
			IF(array_contains(map_keys(com_attr_map), "适用性别"), com_attr_map["适用性别"], "未知") AS "适用性别",
			IF(array_contains(map_keys(com_attr_map), "适用症状"), com_attr_map["适用症状"], "未知") AS "适用症状"
		FROM
			(
				SELECT
					cate_id,
					sku_id,
					str_to_map(concat_ws(",", collect_set(concat_ws(":", attr_name, attr_value))), ",", ":") AS com_attr_map
				FROM
					dev.dev_sku_attr_table
				WHERE
					dt = sysdate( - 2)
					AND cate_id IN("13328", "13329")
					AND attr_name IN("包装", "国产进口", "类型", "使用方法", "适用人群", "适用性别", "适用症状")
				GROUP BY
					cate_id,
					sku_id
				ORDER BY
					cate_id,
					sku_id
			)
			a
	)
	b

2.1、按照商品SKU将其所有属性collect到一个字段,并转换成map形式后的数据结果:

2.2、将map的key分别获取后,平铺展示数据结果为:

 即为想要的数据结果形式。

命令参考:

hive复杂类型数据详解—array,map,struct_hive array_濛小万的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值