HIVE SQL JOIN
最近总结了一下hive表关联的用法,与Postgres表关联还是有细微差别,总结在这里方便以后查看。
join语法
join_table:
table_reference [INNER] JOIN table_factor [join_condition]
| table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition
| table_reference LEFT SEMI JOIN table_reference join_condition table_reference:
table_factor
| join_table table_factor:
tbl_name [alias]
| table_subquery alias
| ( table_references ) join_condition:
ON expression
支持join多路连接,但不支持笛卡尔积,即无条件join的连接。equality_expression是一个等式表达式,不支持非等值连接(on 后面的条件为等值)
examples
select a.* from a join b on (a.id = b.id)
select a.* from a join b on (a.id = b.id and a.department = b.department)
两个表以上关联
select a.val. b.val, c.val from a join b on (a.key = b.key1) join c on (c.key= b.key2)
如果多个表关联使用同一个键,则只创建单个map/reduce job
select a.val, b.val, c.val from a join b on (a.key = b.key1) join c on (c.key = b.key1)
相反,如果不是都使用key1关联,而是使用key2与c表关联,则会创建两个map/reduce job,b.key1用于第一次join条件,而b.key2用于第二次join。
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任务逻辑是这样的:reduce会缓存join序列中除了最后一个表的所有结果记录到buffer,再通过最后一个表将结果序列化到文件系统。这一实现机制有助于在reduce端减少内存的使用量。实践中,应该把最大的那张表卸载最后(否则会因为缓存浪费大量内存),例如在
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(一次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)
中,使用了两次MR任务。第一次缓存a表,用b表序列化;第二次缓存第一次map/reduce的结果,然后用C表序列化.
每次join task之前都存在一个数据的shuffle的开销,所以我们为了能把相同的key的join合并到一步里完成,减少shuffle的次数,需要在写join顺序的时候把相同key的join放在一块.
如果要过滤join结果输出,可以在where条件里面添加过滤条件,或者是写到join子句里面。
select a.val, b.val
from a left join b on (a.key = b.key)
where a.ds = '2009-07-07' and b.ds = '2009-07-07'
如果b表找不到对应在a表的记录,b表的所有列都会列为NULL,包括ds列。后面where条件会过滤掉所有的行。对于出现在where条件里面的b表的列来说,与left join没有什么关系了。
我们一般选择这样写:
select a.val, b.val
from a left join b on (a.key = b.key and b.ds = '2018-09-09' and a.ds = '2018-09-09')
这一查询加过是在join的时候就过滤掉的,不存在上述问题。这个貌似和关系型数据库的left join不一样,a表条件加在join之后是没有用的,总会返回a表所有数据,只能加在where条件后面!
left semi join/left anti join, 右表只能出现在关联条件(on-clause)里面,件不能出现在where和select子句中。left semi join相当于in的语法。left anti join相当于not in。
select a.key, a.value
from a
where a.key in
(select b.key from b);
可以写成
SELECT a.val, a.value
from a
left semi join b on (a.key = b.key)
map join
当一个大表和一个或多个小表做Join时,可以使用MapJoin,性能比普通的Join要快很多。MapJoin 的基本原理为:在小数据量情况下,SQL会将您指定的小表全部加载到执行Join操作的程序的内存中,从而加快Join的执行速度。
使用 MapJoin 时,要注意以下问题:
left outer join的左表必须是大表。
right outer join的右表必须是大表。
inner join左表或右表均可以作为大表。
full outer join不能使用MapJoin。
MapJoin支持小表为子查询。
使用MapJoin时,需要引用小表或是子查询时,需要引用别名。
在MapJoin中,可以使用不等值连接或者使用or连接多个条件。
目前,MaxCompute在MapJoin中最多支持指定8张小表,否则报语法错误。
如果使用MapJoin,则所有小表占用的内存总和不得超过512MB。由于MaxCompute是压缩存储,因此小表在被加载到内存后,数据大小会急剧膨胀。此处的512MB限制是加载到内存后的空间大小。
多个表Join时,最左边的两个表不能同时是MapJoin的表。
示例如下:
select /* + mapjoin(a) */
a.shop_name,
b.customer_id,
b.total_price
from shop a join sale_detail b
on a.shop_name = b.shop_name;
MaxCompute SQL不支持在普通Join的on条件中使用不等值表达式,or逻辑等复杂的Join条件,但是在MapJoin中可以进行如上操作。
示例如下:
select /*+ mapjoin(a) */
a.total_price,
b.total_price
from shop a join sale_detail b
on a.total_price < b.total_price or a.total_price + b.total_price < 500;
HIVE SQL JOIN的更多相关文章
- 【hive】——Hive sql语法详解
Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的SQL查 ...
- HIVE: Map Join Vs Common Join, and SMB
HIVE Map Join is nothing but the extended version of Hash Join of SQL Server - just extending Hash ...
- hive sql 语法详解
Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的SQL查 ...
- Hadoop Hive sql语法详解
Hadoop Hive sql语法详解 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件 ...
- 深入浅出Hive企业级架构优化、Hive Sql优化、压缩和分布式缓存(企业Hadoop应用核心产品)
一.本课程是怎么样的一门课程(全面介绍) 1.1.课程的背景 作为企业Hadoop应用的核心产品,Hive承载着FaceBook.淘宝等大佬 95%以上的离线统计,很多企业里的离线统 ...
- Hadoop Hive sql 语法详细解释
Hive 是基于Hadoop 构建的一套数据仓库分析系统.它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,能够将结构 化的数据文件映射为一张数据库表,并提供完整的SQL查 ...
- hive:join操作
hive的多表连接,都会转换成多个MR job,每一个MR job在hive中均称为Join阶段.按照join程序最后一个表应该尽量是大表,因为join前一阶段生成的数据会存在于Reducer 的bu ...
- Hive SQL 分类
题目: 请使用Hive SQL实现下面的题目. 下面是一张表名为user_buy_log的表,有三个字段,user(用户),grp(分组编号),time(购物时间). 需要将用户按照grp分组,对ti ...
- Hive SQL 编译过程
转自:http://www.open-open.com/lib/view/open1400644430159.html Hive跟Impala貌似都是公司或者研究所常用的系统,前者更稳定点,实现方式是 ...
随机推荐
- bat命令遍历文件和bat参数说明
**************************************************************************************************** ...
- hdu 5881 Tea (2016 acm 青岛网络赛)
原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=5881 Tea Time Limit: 3000/1000 MS (Java/Others) Me ...
- nginx(Window下安装 & 配置文件参数说明 & 实例)
一.为什么需要对Tomcat服务器做负载均衡: Tomcat服务器作为一个Web服务器,其并发数在300-500之间,如果有超过500的并发数便会出现Tomcat不能响应新的请求的情况,严重影响网站 ...
- C语言基础知识【简介】
C 简介1.关于 CC 语言是为了编写 UNIX 操作系统而被发明的.C 语言是以 B 语言为基础的,B 语言大概是在 1970 年被引进的.C 语言标准是于 1988 年由美国国家标准协会(ANSI ...
- 【BZOJ3744】Gty的妹子序列 分块+树状数组
[BZOJ3744]Gty的妹子序列 Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见…… 某天,蒟蒻Autumn发现了从 Gty的妹子树(bzo ...
- z-index随笔
z-index这个css属性是用来控制层级的,但是它的表现有点奇怪,这里做下记录. 假如有ABC三层,都没设置z-index时,是按dom节点顺序来控制层级. 此时如果B元素下有个元素D,设置了z-i ...
- php输出缓冲区
ob_start(); echo 'aaa'; $string = ob_get_contents(); file_put_contents('a.html', $string); ob_flush( ...
- Linux安装Nignx基于域名的多虚拟主机实战
看这个文章之前,要保证你的Nginx已经安装成功! 如果没有,请移步到下面这个文章,看完后再回来看! https://www.cnblogs.com/apollo1616/p/10214531.htm ...
- spring 注解管理
一.注解准备 1.xml引入新的约束,并开启注解扫描 context:component-scan标签开启注解扫描 2.导入注解有关jar包 二.注解创建对象 1.User类 @Component( ...
- [原创]关于设置linux中vim 显示行号
1.更改所有账户配置 直接更改/etc/vimrc vim /etc/vimrc 在vimrc文件的最后添加 set nu 即可 wq退出. 这样,不论使用哪个账号登陆,vim打开后都显示行号 2.为 ...