HiveQL查询操作全解(三):JOIN语句

Hive支持通常的SQL JOIN,但是支持等值连接

1、INNER JOIN

内连接中,只有进行连接的两个表中都存在于连接标准相匹配的数据才会被保留下来。比如下面的例子:

SELECT a.ymd,a.price_close,b.price_close
FROM stocks a JOIN stocks b ON a.ymd=b.ymd
WHERE a.symbol = 'APPL'  AND b.symbol ='IBM';

也可以进行多表连接:

SELECT a.ymd,a.price_close,b.price_close,c.price_close
FROM stocks a JOIN stocks b ON a.ymd = b.ymd
                           JOIN stocks c ON a.ymd = b.ymd
WHERE a.symbol = 'APPL' AND b.symbol = 'IBM" AND c.symbol ='GE';

在多表连接时,我们可以想办法对连接进行优化,HIVE嘉定查询中最后一个表是最大的那个表。在对每行记录进行连接操作时,它会尝试将其他表缓存起来,然后扫描最后那个表进行计算。因此,用户需要保证连续查询中表的大小是从左到右是依次增加的。

如果我们没有把最大的表放在最后面,我们可以显式地告诉查询优化器哪个表是大表:

SELECT /*+STREAMTABLE(a)*/ a.ymd,a.price_close,b.price_close,c.price_close
FROM stocks a JOIN stocks b ON a.ymd = b.ymd
                           JOIN stocks c ON a.ymd = b.ymd
WHERE a.symbol = 'APPL' AND b.symbol = 'IBM" AND c.symbol ='GE';

2、LEFT OUTER JOIN

在左外连接中,JOIN操作符左边表中符合WHERE自居的所有记录将会被返回。JOIN操作符右边表中如果没有符合ON后面连接条件的记录时,那么从右边表指定选择的列的值将会是NULL。

SELECT a.ymd,a.price_close,b.price_close
FROM stocks a LEFT OUTER JOIN stocks b ON a.ymd=b.ymd
WHERE a.symbol = 'APPL'  AND b.symbol ='IBM';

3、OUTER JOIN

外连接的定义大家一定都知道啦,不过有一个问题值得我们讨论。在WHERE自居中增加分区过滤器可以加快查询速度,我们先看如下的代码:

SELECT s.ymd,s.symbol,s.price_close,d.dividend
FROM stocks s LEFT OUTER JOIN dividends d ON s.ymd=d.ymd AND  s.symbol=d.symbol
WHERE s.symbol='APPL' AND s.exchange='NASDAQ' and d.exchange='NASDAQ'

看上去是外连接,但其实结果却是内连接的结果!为什么?因为在连接的时候,会限制性JOIN语句,然后再将结果通过WHERE语句进行过滤,在到达WHERE语句时,d.exchange字段中大多数时NULL,这些当然不满足WHERE的条件,因此被过滤掉。

一个直接有效的方法是,直接在WHERE条件中去掉d.exchange='NASDAQ',当然,这种方法不一定总令人满意。还有一个适用于所有种类连接的解决方案,那即是使用嵌套SELECT 语句,将过滤写在连接之前:

SELECT s.ymd,s.symbol,s.price_close,d.dividend FROM
(SELECT * FROM stocks WHERE symbol='AAPL' AND exchange='NASDAQ') s
LEFT OUTER JOIN
(SELECT * FROM dividends WHERE symbol='APPL' AND exchange='NASDAQ') d
ON s.ymd=d.ymd;

4、RIGHT OUTER JOIN

右外连接会返回右边表所有符合WHERE语句的记录,左表中匹配不上的字段值用NULL代替。

5、FULL OUTER JOIN

使用完全外连接将会返回所有表中符合WHERE语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用NULL值代替。

6、LEFT SEMI-JOIN

左半开连接会返回左边表的记录,前提是其记录对于右边表满足ON语句中的判定条件。
Hive中不支持以下查询:

SELECT s.ymd,s.symbol,s.price_close FROM stocks s
WHERE s.ymd,s.symbol IN
(SELECT d.ymd,d.symbol FROM dividends d);

不过用户可以通过LEFT SEMI JOIN实现同样的效果

SELECT s.ymd,s.symbol,s.price_close
FROM stocks s LEFT SEMI JOIN dividends d ON s.ymd=d.ymd AND s.symbol = d.symbol;

SEMI-JOIN比通常的INNER JOIN要更高效,原因是对于左表中一条指定的记录,在右边表一旦找到匹配的记录,Hive就会立刻停止扫描。从这点来看,左边表中选择的列是可以预测的。

7、笛卡尔积JOIN

笛卡尔积是一种连接,表示左边表的行树乘以右边表的行数等于笛卡尔积结果集的大小。

8、map-side JOIN

如果所有表中有一张是小表,那么可以在最大的表通过mapper的时候将小表完全放到内存中,Hive可以在map端执行连接过程。这是因为Hive可以和内存中的小表进行逐一匹配,从而省略掉常规连接操作所需要的reduce过程,即使对于很小的数据集,这个优化也明显地快于常规的连接操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容