背景介绍
比如拿到了每个人吃的食物,并且知道每种食物的卡路里,需要计算每个人的摄入的总卡路里数。怎么计算呢?
表p_food
| name | food |
|---|---|
| Lily | apple、milk、rice |
| Amy | meat、water、 |
表f_calorie
| food | Calorie |
|---|---|
| apple | 50 |
| milk | 100 |
| rice | 200 |
| water | 0 |
| meat | 200 |
| ...... | ...... |
解决方案
需要把p_food表中的food列表进行拆分,拆分为如下形式:
| name | Food |
|---|---|
| Lily | apple |
| Lily | milk |
| Lily | rice |
| Amy | meat |
| Amy | water |
| ...... | ...... |
然后再关联f_calorie表,获得每种食物的calorie。
最后通过group by聚合求的每个人摄取的calorie。
select name
,sum(calorie)
from
(select t1.name
,fd
,t2.calorie
from p_food t1 lateral view explode(split(food,'、')) as fd
left join f_calorie t2 on t1.food = t2.food)
group by name
值得注意的是,lateral view explode只支持hive、spark,不支持impala。
现在想想explode()这个函数还是很形象的,explode有爆炸的意思,在这里是是按照一定的格式(比如split(food,'、')先按照顿号分割,然后铺开为多行)分裂数据。
欢迎关注微信公众号“数据分析师手记”