hive中的LEFT SEMI JOIN

LEFT SEMI JOIN 是 IN/EXISTS 子查询的一种更高效的实现。

hive 中没有in/exist 这样的子句,所以需要将这种类型的子句转成left semi join. left semi join 是只传递表的join key给map 阶段 , 如果key 足够小还是执行map join, 如果不是则还是common join

可以用 LEFT SEMI JOIN 重写你的子查询语句。LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。

 

  SELECT a.key, a.value

  FROM a

  WHERE a.key in

   (SELECT b.key

    FROM B);

可以被重写为:

   SELECT a.key, a.val

   FROM a LEFT SEMI JOIN b on (a.key = b.key)

 

select * from gs_log a left semi join wg_gamelist b on (a.gameid = b.game_id) where a.dt='2013-12-26' limit 10;

猜你喜欢

转载自kelvinliu117.iteye.com/blog/1996711