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的更多相关文章

  1. Hive的join表连接查询的一些注意事项

    Hive支持的表连接查询的语法: join_table: table_reference JOIN table_factor [join_condition] | table_reference {L ...

  2. hive的join查询

    hive的join查询 语法 join_table: table_reference [INNER] JOIN table_factor [join_condition] | table_refere ...

  3. 【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 ...

  4. hive:join操作

    hive的多表连接,都会转换成多个MR job,每一个MR job在hive中均称为Join阶段.按照join程序最后一个表应该尽量是大表,因为join前一阶段生成的数据会存在于Reducer 的bu ...

  5. Hive 中Join的专题---Join详解

    1.什么是等值连接? 2.hive转换多表join时,如果每个表在join字句中,使用的都是同一个列,该如何处理? 3.LEFT,RIGHT,FULL OUTER连接的作用是什么? 4.LEFT或RI ...

  6. Hive中Join的类型和用法

    关键字:Hive Join.Hive LEFT|RIGTH|FULL OUTER JOIN.Hive LEFT SEMI JOIN.Hive Cross Join Hive中除了支持和传统数据库中一样 ...

  7. Hive 基本语法操练(五):Hive 的 JOIN 用法

    Hive 的 JOIN 用法 hive只支持等连接,外连接,左半连接.hive不支持非相等的join条件(通过其他方式实现,如left outer join),因为它很难在map/reduce中实现这 ...

  8. hive查询不加分区的一个异常

    今天下午有同事反馈她提交了了一个SQL后,hive 查询就停止响应了. 我看了下,发现hiveserver确实hug住了.听过查看日志,发现了一个牛逼的SQL, 这个SQL很简单: select a. ...

  9. hive的join优化

    “国际大学生节”又称“世界大学生节”.“世界学生日”.“国际学生日”.1946年,世界各国学生代表于布拉格召开全世界学生大会,宣布把每年的11月17日定为“世界大学生节”,以加强全世界大学生的团结和友 ...

随机推荐

  1. 170324、Spring 处理器和Resource

    1.Spring 框架允许开发者使用两种后处理器扩展 IoC 容器,这两种后处理器扩展 IoC 容器,这两种后处理器可以后处理 IoC 容器本身,或对容器中所有的 Bean 进行后处理.IoC 容器还 ...

  2. CH5E01 乌龟棋【线性DP】

    5E01 乌龟棋 0x5E「动态规划」练习 描述 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物.乌龟棋的棋盘是一行N 个格子,每个格子上一个分数(非负整数).棋盘第1 格是唯一的起点,第N 格是终点 ...

  3. java 程序命名规则

    程序命名规则提示:模块设计人员确定本软件的模块命名规则(例如类.函数.变量等),确保模块设计文档的风格与代码的风格保持一致.可以从机构的编程规范中摘取或引用(如果存在的话).命名规则1.包命名     ...

  4. 通过virt-manager 利用NFS创建、迁移虚拟机2

    前面一篇文章介绍了利用NFS创建虚拟机的过程,本文就介绍下如何利用NFS对虚拟机进行动态迁移. 动态迁移就是把一台虚拟机在不停止其运行的情况下迁移到另一台物理机上.这看起来似乎不太可能,不过还好kvm ...

  5. MapReduce学习笔记

    一.MapReduce概述 MapReduce 是 Hadoop 的核心组成, 是专用于进行数据计算的,是一种分布式计算模型.由Google提出,主要用于搜索领域,解决海量数据的计算问题. MapRe ...

  6. Linux ls命令

    ls:即列表List的意思,用来列出目录下的文件用来列出给定目录下的文件,参数为空默认列出当前目录下的文件. 用法是:ls [选项] [目录] 常用的选项有 -a, –all 列出目录下的所有文件,包 ...

  7. Swift学习——Swift基础具体解释(一)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhenyu5211314/article/details/34807025 注:由于基础部分在Swi ...

  8. HDU3123:GCC(同余模简单题)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3123 题意很简单,就是同余模的简单应用. 代码如下: #include <iostream> ...

  9. mysql 锁相关的视图(未整理)

    mysql 锁相关的视图 查看事务,以及事务对应的线程ID   如果发生堵塞.死锁等可以执行kill  线程ID  杀死线程      kill  199 SELECT * FROM informat ...

  10. openURL的使用

    1)私有方法跳转 /** 私有方法,不建议使用 利用ASCII值进行拼装组合方法.这样可绕过审核. 上面是进入蓝牙界面的方法.也可以有其他的页面可以跳转.设置页面是@"@"Pref ...