遇到一个有意思的数据处理问题,需要将商品的所有属性获取出来,然后每个商品一条记录,将其所有属性跟在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分别获取后,平铺展示数据结果为:
即为想要的数据结果形式。
命令参考: