mapjoin、分区表、不等值匹配
业务需求:
A表,小表,穷举的100个动漫电影的IP,表结构ip(id string, key string)
B表,大表,每天的交易数据,上亿条,表结构order(ds string, item_titlestring,buyer_id string, fee string)
现在想要得到这100个动漫电影相关产品的每天的销售额、购买人数。
SQL:
1、建表
create table if not exists jieguo
(
ds string,
fee string ,
cnt string
)
partitioned by (pt string )
2、跑数据
Insert overwrite table jieguo partition (pt=201503)
Select /*+MAPJOIN(a)*/
b.ds,sum(b.fee),count(b.buyer_id)
from ip b
Join
(Select ds, fee,buyer_id
From order
Where ds>=20150101 and ds<=20150331
)b
On instr(b.item_title,a.key)>0
Group by b.ds
学习要点:
1、/*+MAPJOIN*/的用法
如果关联的2张表大小差距悬殊或者进行不等值连接时,一般的join会导致运行速度很慢,使用mapjoin可以有效提高效率
使用场景:
(1)关联操作中的一张表非常小
(2)不等值连接
Select /*+MAPJOIN(a)*/,括号里加的是小表的名称
2、分区表
如果输出的数据比较多,可以采取分区的形式
建表时加一条语句partitioned by
跑数据时Insert overwrite table jieguo partition (pt=201503)