select /*+ MAPJOIN(time_dim)*/ count(1)fromstore_salesjointime_dimon (ss_sold_time_sk = t_time_sk)
2) 需要做不等值join操作(a.x < b.y 或者 a.x like b.y等)
这种操作如果直接使用join的话语法不支持不等于操作,hive语法解析会直接抛出错误
如果把不等于写到where里会造成笛卡尔积,数据异常增大,速度会很慢。甚至会任务无法跑成功~
根据mapjoin的计算原理,MapJoin会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配。这种情况下即使笛卡尔积也不会对任务运行速度造成太大的效率影响。
而且hive的where条件本身就是在map阶段进行的操作,所以在where里写入不等值比对的话,也不会造成额外负担。
select /*+ MAPJOIN(a)*/a.start_level, b.*
fromdim_level ajoin (select * fromtest) bwhere b.xx>=a.start_level and b.xx
3) MAPJOIN 结合 UNIONALL
原始sql:
select a.*,coalesce(c.categoryid,’NA’) asapp_categoryfrom (select * fromt_aa_pvid_ctr_hour_js_mes1
) aleft outer join(select *fromt_qd_cmfu_book_info_mes
) con a.app_id=c.book_id;
速度很慢,老办法,先查下数据分布:
select *</