栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

hive中的join

hive中的join

1.1.JOIN语句

HIVE 支持通常的SQL JOIN语句,但是只支持等值连接;hive目前还不支持在ON 子句中使用OR;

1.1.1.INNER JOIN

内连接(INNER JOIN),只有进行连接的两个表中都存在与连接标准相匹配的数据才会被保留下来。

eg:

SELECt A.FIELDS, B.FIELDS FROM TABLE_A A JOIN TBALE_B B ON A.KEY = B.KEY 
--这个例子中,只有A表和B表的交集才会被保留下来;
1.1.2.LEFT OUTER JOIN(左外连接)

eg:

SELECt A.FIELDS, B.FIELDS FROM TABLE_A A LEFT OUTER JOIN TBALE_B B ON A.KEY = B.KEY where A.A.FIELD_1 = '001'
--在LEFT OUTER JOIN连接中,join左边表中符合where 子句中的所有记录都会被返回,join右边表中如果没有符合ON 后面连接条件的记录时,那么select中指定右表的列就返回NULL;
1.1.3. OUTER JOIN (外连接)

对于外连接来说,分区过滤条件不能放置在ON语句中,外连接会忽略掉分区过滤条件,不过对于内连接使用这样的过滤谓词是起作用的;

eg:

--外连接:
select a.user_id,b.city,a.dt from dwd_user a left outer join dwd_user_app_pv b on a.user_id = b.user_id and  a.dt = '20190610' limit 10;
--dt是分区字段 
结果:
47  NULL    20190612
47  NULL    20190610
48  NULL    20190612
48  NULL    20190610
49  NULL    20190612
49  NULL    20190610
50  NULL    20190612
50  NULL    20190610
--内连接
select a.user_id,b.city,a.dt from dwd_user a inner join dwd_user_app_pv b on a.user_id = b.user_id and  a.dt = '20190610' limit 10;
结果:
a.user_id   b.city  a.dt
301 滁州市 20190610
301 滁州市 20190610
301 滁州市 20190610
301 滁州市 20190610
301 滁州市 20190610
302 通化市 20190610
302 通化市 20190610
302 通化市 20190610
302 通化市 20190610
302 通化市 20190610
--结论:on语句中的分区过滤条件外连接中是无效的,在内连接中是有效的;
1.1.4. RIGHT OUTER JOIN (右外连接)

右外连接会返回右表中所有符合where语句的记录,左表中匹配不上用NULL代替;

eg:

SELECt A.FIELDS, B.FIELDS FROM TABLE_A A RIGHT OUTER JOIN TBALE_B B ON A.KEY = B.KEY where A.A.FIELD_1 = '001'
--在RIGHT OUTER JOIN连接中,join右边表中符合where 子句中的所有记录都会被返回,join左边表中如果没有符合on 后面连接条件的记录时,那么select中指定左表的列就返回NULL;
1.1.5. FULL OUTHER JOIN(全外连接)

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

eg:

SELECT A.FIELDS, B.FIELDS FROM TABLE_A A FULL OUTHER JOIN TBALE_B B ON A.KEY = B.KEY where A.A.FIELD_1 = '001'
--在FULL OUTHER JOIN连接中,将会返回所有表中符合where 语句条件的所有记录,如果select 中任一表的指定字段没有符合条件的值的话,那么就使用NULL值代替;
1.1.6 LEFT SEMI JOIN(左半开连接)

左半开连接(LEFT SEMI JOIN)会返回左表的记录,前提是其记录对于右表满足ON语句中条件;是 IN/EXISTS 子查询的一种更高效的实现;

LEFT SEMI JOIN 的限制是, JOIN 子句中右边的表只能在 ON 子句中设置过滤条件,SELECT 和WHERe 语句不能引用到右边表中的字段;

SEMI JOIN比通常的INNER JOIN更高效,因为对于左表中一条指定的记录,在右表中一旦找到匹配的记录,hive就会立刻停止扫描;

eg:

SELECT a.key, a.value FROM a WHERe a.key in
(SELECt b.key FROM B);
可以被重写为:
SELECt a.key, a.value FROM a LEFT SEMI JOIN b on a.key = b.key
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779950.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号