hive mapjoin

insert overwrite table crosstest
select  /*+MAPJOIN(a)*/ a.ra,a.dec,b.ra,b.dec
from  rosat2rc  a  join  tycho2rc  b
on (a.dec>83 and a.dec<93 and b.dec>83 and b.dec<93)
where 3.5*3.5/1200/1200>((a.ra-b.ra)*cos((a.dec+b.dec)*3.14/180/2))*((a.ra-b.ra)*cos((a.dec+b.dec)*3.14/180/2))+(a.dec-b.dec)*(a.dec-b.dec)

当要连接的两个表其中一个表非常小的时候,可以考虑使用mapjoin。mapjoin会将小表拷贝到每个运行map的节点上,并将其cache到内存中,然后在map阶段连接大表。由于省去了reduce过程,效率会提高不少。使用mapjoin之后,join会执行两个map-reduce Job,不用mapjoin则只有一个。问了下少杰,原来hive.merge.mapfiles这个参数设置为true了。因为只有map而没有reduce,map的数量又不好控制,可能导致大量的map任务,这样会生成许多文件。hive.merge.mapfiles为true时,会启动另外一个map-reduce Job来合并小文件。

common join 则只有一个mapreduce任务,map扫描排序表数据,reduce进行join操作。

相关推荐