hive 多行转一列
文章目录
多行转一列
表 test。同一件商品可能有多个平台属性,表中一行数据代表一个平台属性。表字段:sku_id:‘商品id’,attr_id:‘商品的平台属性id’,value_id:‘商品的平台属性值id’,attr_name:‘商品的平台属性名称’,value_name:‘商品的平台属性值名称’
sku_id | attr_id | value_id | attr_name | value_name |
---|---|---|---|---|
1 | 106 | 176 | 手机一级 | 安卓手机 |
1 | 107 | 177 | 二级手机 | 小米 |
1 | 23 | 83 | 运行内存 | 8g |
1 | 24 | 82 | 机身内存 | 128g |
2 | 106 | 176 | 手机一级 | 安卓手机 |
2 | 107 | 177 | 二级手机 | 小米 |
2 | 23 | 83 | 运行内存 | 8g |
2 | 24 | 166 | 机身内存 | 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_id | attr |
---|---|
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”}] |