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

遇到一个有意思的数据处理问题,需要将商品的所有属性获取出来,然后每个商品一条记录,将其所有属性跟在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博客

猜你喜欢

转载自blog.csdn.net/eylier/article/details/128836430
今日推荐