Hive查询Join
Select a.val,b.val From a [Left|Right|Full Outer] Join b On (a.key==b.key);
现有两张表:sales 列出了人名及其所购商品的 ID;things 列出商品的 ID 和名称:
hive> select * from sales;
OK
Joe 2
Hank 4
Ali 0
Eve 3
Hank 2
Time taken: 0.085 seconds, Fetched: 5 row(s)
hive> select * from things;
OK
2 Tie
4 Coat
3 Hat
1 Scarf
Time taken: 0.069 seconds, Fetched: 4 row(s)
1.内连接
Hive只支持等值连接,这意味着在 ON 关键字后的表达式中只能使用等号。具体JAVA-API实现详见:MR案例:内连接
hive> select sales.*,things.*
> from sales JOIN things ON(sales.id = things.id);
Joe 2 2 Tie
Hank 4 4 Coat
Eve 3 3 Hat
Hank 2 2 Tie
此外还可以在Where子句中指定连接条件。
hive> select sales.*,things.*
> from sales,things
> where sales.id = things.id;
OK
Joe 2 2 Tie
Hank 4 4 Coat
Eve 3 3 Hat
Hank 2 2 Tie
单个的连接用一个 MR 作业实现。但是,如果多个连接的连接条件中使用了相同的列,那么平均每个连接可以至少用一个 MR 作业来实现。可以在查询前使用 Explain关键字 来查看 Hive将为某个查询使用多少个 MR 作业:【此部分在以后详述】
hive> explain
> select sales.*,things.*
> from sales join things on (sales.id=things.id);
2.外连接
外连接可以让你找到连接表中不能匹配的数据行。前面的内连接,【Ali】那一行没有出现在输出中。因为她所购买商品的ID没有在things表中出现。具体JAVA-API实现详见MR案例:外连接
左外连接:就可以显示左边表的所有数据行:T_Name1 LEFT OUTER JOIN T_Name2 ON ()
hive> select sales.*,things.*
> from sales LEFT OUTER JOIN things ON(sales.id = things.id);
OK
Joe 2 2 Tie
Hank 4 4 Coat
Ali 0 NULL NULL
Eve 3 3 Hat
Hank 2 2 Tie
Time taken: 13.387 seconds, Fetched: 5 row(s)
右外连接:T_Name1 RIGHT OUTER JOIN T_Name2 ON ()
hive> select sales.*,things.*
> from sales RIGHT OUTER JOIN things ON(sales.id = things.id);
OK
Joe 2 2 Tie
Hank 2 2 Tie
Hank 4 4 Coat
Eve 3 3 Hat
NULL NULL 1 Scarf
Time taken: 14.54 seconds, Fetched: 5 row(s)
全外连接:T_Name1 FULL OUTER JOIN T_Name2 ON ()
hive> select sales.*,things.*
> from sales FULL OUTER JOIN things ON(sales.id = things.id);
OK
Ali 0 NULL NULL
NULL NULL 1 Scarf
Hank 2 2 Tie
Joe 2 2 Tie
Eve 3 3 Hat
Hank 4 4 Coat
Time taken: 44.671 seconds, Fetched: 6 row(s)
半连接:T_Name1 LEFT SEMI JOIN T_Name2 ON ()
hive> select * from things
> where things.id in
> (select id from sales);
OK
2 Tie
4 Coat
3 Hat
Time taken: 15.633 seconds, Fetched: 3 row(s)
In查询可以转化为 半连接查询。必须遵循一个限制:右表(sales)只能在ON子句中出现。
hive> select * from things
> LEFT SEMI JOIN sales ON(sales.id=things.id);
OK
2 Tie
4 Coat
3 Hat
Time taken: 13.169 seconds, Fetched: 3 row(s)
3.Map-side Join 具体JAVA-API实现详见MR案例:Map-Join
- Join操作在 map 阶段完成,因此无需 reduce 阶段
- 适合 一个大表,一个小表 的 Join 操作
- 思想:小表复制到各个节点上,并加载到内存中;而对大表进行分片,每个分片与小表完成 Join 操作
select /*+ mapjoin(things) */ sales.*,things.*
from sales join things on sales.id=things.id; //等同于
select sales.*,things.*
from sales join things on sales.id=things.id;
- hive 0.6 的时候默认认为写在select 后面的是大表,前面的是小表,或者使用 /*+mapjoin(map_table) */ 手工进行设定。
- hive 0.7 以后这个计算是自动完成,设置 hive.auto.convert.join=true ,hive会自动判断哪个是小表,哪个是大表。判断小表的依据是hive.smalltable.filesize=25000000L(默认是25M),当小表超过这个大小,hive会自动转化成common join,即reduce-join。
4.Reduce-side Join 具体JAVA-API实现详见MR案例:Reduce-Join
- Join操作在reduce task中完成 【默认的join方式】
- 适合两个大表连接操作
- 思想:map端按照连接字段进行hash,reduce 端完成连接操作
5.用于多于2个表的Join(有区别)
SELECT a.val, b.val, c.val FROM a
JOIN b ON (a.key = b.key1)
JOIN c ON (c.key = b.key1);
如果 Join 的 key 相同,不管有多少个表,都会则会合并为一个 Map-Reduce
SELECT a.val, b.val, c.val FROM a
JOIN b ON (a.key = b.key1)
JOIN c ON (c.key = b.key2);
如果 Join 的条件不相同,Map-Reduce 的任务数目和 Join 操作的次数是相对应.(本例2次)
6.Join每次MR任务的逻辑
reducer 会缓存 join 序列中除了最后一个表的所有表的记录, 再通过最后一个表将结果序列化到文件系统。 这一实现有助于在 reduce 端减少内存的使用量。实践中,应该把最大的那个表写在最后(否则会因为缓存浪费大量内存)。例如:
SELECT a.val, b.val, c.val FROM a
JOIN b ON (a.key = b.key1)
JOIN c ON (c.key = b.key1);
使用 1 次MR任务,reduce 端会缓存 a 表和 b 表的记录,然后每次取得一个 c 表的记录就计算一次 join 结果。
SELECT a.val, b.val, c.val FROM a
JOIN b ON (a.key = b.key1)
JOIN c ON (c.key = b.key2);
使用 2 次MR任务,第一次缓存 a 表,用 b 表序列化;第二次缓存第一次 map/reduce 任务的结果,然后用 c 表序列化。
Hive查询Join的更多相关文章
- Hive的join表连接查询的一些注意事项
Hive支持的表连接查询的语法: join_table: table_reference JOIN table_factor [join_condition] | table_reference {L ...
- hive的join查询
hive的join查询 语法 join_table: table_reference [INNER] JOIN table_factor [join_condition] | table_refere ...
- 【HIVE】(3)联合查询join、时间戳函数、字符串函数
数据 t_join1.txt 1,a,1 2,b,2 3,c,4 t_join2.txt 1,2a 2,2b 3,2c 建表.导入: create table t_join1(id int, name ...
- hive:join操作
hive的多表连接,都会转换成多个MR job,每一个MR job在hive中均称为Join阶段.按照join程序最后一个表应该尽量是大表,因为join前一阶段生成的数据会存在于Reducer 的bu ...
- Hive 中Join的专题---Join详解
1.什么是等值连接? 2.hive转换多表join时,如果每个表在join字句中,使用的都是同一个列,该如何处理? 3.LEFT,RIGHT,FULL OUTER连接的作用是什么? 4.LEFT或RI ...
- Hive中Join的类型和用法
关键字:Hive Join.Hive LEFT|RIGTH|FULL OUTER JOIN.Hive LEFT SEMI JOIN.Hive Cross Join Hive中除了支持和传统数据库中一样 ...
- Hive 基本语法操练(五):Hive 的 JOIN 用法
Hive 的 JOIN 用法 hive只支持等连接,外连接,左半连接.hive不支持非相等的join条件(通过其他方式实现,如left outer join),因为它很难在map/reduce中实现这 ...
- hive查询不加分区的一个异常
今天下午有同事反馈她提交了了一个SQL后,hive 查询就停止响应了. 我看了下,发现hiveserver确实hug住了.听过查看日志,发现了一个牛逼的SQL, 这个SQL很简单: select a. ...
- hive的join优化
“国际大学生节”又称“世界大学生节”.“世界学生日”.“国际学生日”.1946年,世界各国学生代表于布拉格召开全世界学生大会,宣布把每年的11月17日定为“世界大学生节”,以加强全世界大学生的团结和友 ...
随机推荐
- java发展历程、常用dos命令与jDK工具使用
Java菜鸟学习之旅 1.勤敲代码 2.必须将课堂上讲的内容学到位 2.1 学到会用 2.2 在学会之前不要自作主张 2.3 当天课程当天完成 3.能说会道 3.1 善于表达 3.2 学会的都能讲 4 ...
- ObjectId
BSON Types — MongoDB Manual https://docs.mongodb.com/manual/reference/bson-types/#objectid ObjectId ...
- Ubuntu下载及安装
Ubuntu(友帮拓.优般图.乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu 是基于DebianGNU/Linux,支持x86.amd64(即x64)和ppc架构,由全球化 ...
- 1.1 - python基础语法 - 总结练习题
1.编译型与解释型语言的区别,哪些属于编译型,哪些属于解释型 编译型:c/c++/go 运行速度快,开发效率低,不可跨平台 解释型:python/java/php/ruby 运行速度低,开发效率高,可 ...
- 剑指Offer——二叉搜索树的后序遍历序列
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析: 二叉查找树(Binary Search ...
- 病毒侵袭持续中---hdu3065(AC自动机模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 模板题,没什么好说的... #include<stdio.h> #include&l ...
- Python高级特性(1):Iterators、Generators和itertools(转)
译文:Python高级特性(1):Iterators.Generators和itertools [译注]:作为一门动态脚本语言,Python 对编程初学者而言很友好,丰富的第三方库能够给使用者带来很大 ...
- Cache与主存之间的全相联映射,直接映射和组相联映射的区别
2017-02-22 注:本文并非原创,来自百度文库,只是觉得写得较好,故分享之.若是某人的知识产权,望告知!谢谢 1.高速缓冲存储器的功能.结构与工作原理 高速缓冲存储器是存在于主存与CPU之间的一 ...
- Spring-BeanFactory容器
Spring的BeanFactory容器 这是Spring中最简单地容器,它主要的功能是为依赖注入(DI)提供支持.这个容器接口在org.springframework.beans.factory.B ...
- 数据分析之可反复与独立样本的T-Test分析
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jia20003/article/details/24201297 数据分析之独立样本的T-Test分 ...