hive 多行转一列

文章目录

多行转一列

表 test。同一件商品可能有多个平台属性,表中一行数据代表一个平台属性。表字段:sku_id:‘商品id’,attr_id:‘商品的平台属性id’,value_id:‘商品的平台属性值id’,attr_name:‘商品的平台属性名称’,value_name:‘商品的平台属性值名称’

sku_idattr_idvalue_idattr_namevalue_name
1106176手机一级安卓手机
1107177二级手机小米
12383运行内存8g
12482机身内存128g
2106176手机一级安卓手机
2107177二级手机小米
22383运行内存8g
224166机身内存256g

题目描述:将商品的每一个平台属性封装成kv类型并整合成json对象,并将多个平台属性,整合到一个数组中,注意去重

代码编写:

1、将商品的每一个平台属性封装成kv类型并整合成json对象

select sku_id,
       named_struct('attr_id', attr_id, 'value_id', value_id, 'attr_name', attr_name, 'value_name', value_name)
from test;
sku_id_c1
1{“attr_id”:“106”,“value_id”:“176”,“attr_name”:“手机一级”,“value_name”:“安卓手机”}
1{“attr_id”:“107”,“value_id”:“177”,“attr_name”:“二级手机”,“value_name”:“小米”}
1{“attr_id”:“23”,“value_id”:“83”,“attr_name”:“运行内存”,“value_name”:“8g”}
1{“attr_id”:“24”,“value_id”:“82”,“attr_name”:“机身内存”,“value_name”:“128g”}
2{“attr_id”:“106”,“value_id”:“176”,“attr_name”:“手机一级”,“value_name”:“安卓手机”}
2{“attr_id”:“107”,“value_id”:“177”,“attr_name”:“二级手机”,“value_name”:“小米”}
2{“attr_id”:“23”,“value_id”:“83”,“attr_name”:“运行内存”,“value_name”:“8g”}
2{“attr_id”:“24”,“value_id”:“166”,“attr_name”:“机身内存”,“value_name”:“256g”}

2、将多个平台属性,整合到一个数组中,注意去重

select sku_id,
       collect_set(named_struct('attr_id', attr_id, 'value_id', value_id, 'attr_name', attr_name, 'value_name',
                                value_name)) attr
from test
group by sku_id;

结果输出:

sku_idattr
1[{“attr_id”:“107”,“value_id”:“177”,“attr_name”:“二级手机”,“value_name”:“小米”},{“attr_id”:“23”,“value_id”:“83”,“attr_name”:“运行内存”,“value_name”:“8g”},{“attr_id”:“106”,“value_id”:“176”,“attr_name”:“手机一级”,“value_name”:“安卓手机”},{“attr_id”:“24”,“value_id”:“82”,“attr_name”:“机身内存”,“value_name”:“128g”}]
2[{“attr_id”:“24”,“value_id”:“166”,“attr_name”:“机身内存”,“value_name”:“256g”},{“attr_id”:“106”,“value_id”:“176”,“attr_name”:“手机一级”,“value_name”:“安卓手机”},{“attr_id”:“107”,“value_id”:“177”,“attr_name”:“二级手机”,“value_name”:“小米”},{“attr_id”:“23”,“value_id”:“83”,“attr_name”:“运行内存”,“value_name”:“8g”}]