简单的行转列
业务场景:想统计不同商品的销量 进阶的行转列
业务场景:统计出不同商品的下单量
简单的行转列 业务场景:想统计不同商品的销量原始订单数据:
| order_id(订单id) | order_info(订单商品) |
|---|---|
| 10086 | 牙刷,毛巾,水杯,牙膏 |
第一步先把每个订单里边的商品拆出来,也就是行转列,数据转换为下边的形式:
| order_id(订单id) | order_info(订单商品) |
|---|---|
| 10086 | 牙刷 |
| 10086 | 毛巾 |
| 10086 | 水杯 |
| 10086 | 牙膏 |
直接贴代码:
select order_id
,order_info_split
from(
select order_id
,order_info
from table
)a
lateral view explode(split(order_info,',')) b as order_info_split
这样就实现了行转列操作,同时可以根据需求,对转换出来的列数据进行二次处理。
进阶的行转列 业务场景:统计出不同商品的下单量原始订单数据:
| order_id(订单id) | order_info(订单商品) |
|---|---|
| 10086 | {“牙刷”: 1, “毛巾”: 2, “水杯”: 1, “牙膏”: 5} |
目的是想统计该订单不同商品的下单件数,可以分为三步
第一步:仔细观察 order_info 里边的数据并不标准,比如 “牙刷”: 1,1前面对多了空格,需要处理为下边最后一列的形式
| order_id(订单id) | order_info(订单商品) | order_info_replace |
|---|---|---|
| 10086 | {“牙刷”: 1, “毛巾”: 2, “水杯”: 1, “牙膏”: 5} | {“牙刷”:“1”, “毛巾”:“2”, “水杯”:“1”, “牙膏”:“5”} |
代码处理:
select server
,role_id
,order_info
,str_to_map(regexp_replace(order_info,'\{|\}|\s| 42',''),',',':') as order_info_replace
from table
第二步:先把每个订单里边的商品根据 key:value 拆出来,也就是行转列,数据转换为下边的形式
| order_id(订单id) | item_name(商品名) | pay_num(下单数量) |
|---|---|---|
| 10086 | 牙刷 | 1 |
| 10086 | 毛巾 | 2 |
| 10086 | 水杯 | 1 |
| 10086 | 牙膏 | 5 |
代码:
select order_id
,item_name
,pay_num
from(
select server
,role_id
,order_info
,str_to_map(regexp_replace(order_info,'\{|\}|\s| 42',''),',',':') as order_info_replace
from table
)a
LATERAL VIEW explode(npc_dict) b as item_name, item_name
第三步:根据分组聚合统计出不用商品的下单数量
这里就不细讲了,直接贴代码
select order_id
,item_name
,sum(pay_num) as total_pay_num
from(
select order_id
,item_name
,pay_num
from(
select server
,role_id
,order_info
,str_to_map(regexp_replace(order_info,'\{|\}|\s| 42',''),',',':') as order_info_replace
from table
)a
LATERAL VIEW explode(npc_dict) b as item_name, item_name
)b
group by order_id,item_name



