hive的一些join操作以及hivejoin操作的优化
SELECT
u.name,
o.orderid
FROM my_user u
[INNER] JOIN my_order o ON u.uid = o.uid;
SELECT
u.name,
o.orderid
FROM my_user u
LEFT OUTER JOIN my_order o ON u.uid = o.uid;
SELECT
u.name,
o.orderid
FROM my_user u
RIGHT OUTER JOIN my_order o ON u.uid = o.uid;
SELECT
u.name,
o.orderid
FROM my_user u
FULL OUTER JOIN my_order o ON u.uid = o.uid;
只能Select昨天表的内容,也只会输出左边表的内容
SELECT
*
FROM my_user u
LEFT SEMI JOIN my_order o ON u.uid = o.uid;
在正常生产环境下,上述Join操作虽然通用,但是会很浪费时间,因为不仅需要Map阶段,还需要Reduce阶段整合数据,所以上述Join操作也称作(Reduce Side Join)
省略Reduce端,直接在Map端进行整合数据 也就是将其中一张表分别放入每个Map端,这样就可以在Map端将两张表进行整合,但前提是能分别放入每个Map端的那张表必须足够小
上面就是Map Side Join的原理了,可以看出每个Mapper里面都会有一个Small Table Data,这样就可以在Map端完成两张表的Join
hive.smalltable.filesize
决定。-- 使用方式一:
-- 使用 /*+ MAPJOIN(tbl)*/ tbl为表名
SELECT
/*+ MAPJOIN(my_order)*/
u.name,
o.orderid
FROM my_user u
LEFT OUTER JOIN my_order o ON u.uid = o.uid;
-- 方式二:设置hive.auto.convert.join = true,这样hive会自动判断当前的join操作是否合适做map join,主要是找join的两个表中有没有小表。
但是当两张表都不是小表改怎么时,就需要使用Bucket Map Join
Bucket Map Join 使用需求
hive.optimize.bucketmapjoin= true
控制hive 执行bucket map join 如果对于Bucket Map Join中的两张分桶表是有序的,是可以进行Sort Merge Bucket Map Join
由于两张表是有序的,那么在两张表每个桶局部连接时,只需要将每张表便利一次便可以完成整合操作,甚至不用把一个Bucket完整的加载成Hashtable
使用设置
set hive.optimize.bucketmapjoin= true;
set hive.optimize.bucketmapjoin.sortedmerge = true;
set hive.input.format = org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;