最近总结了一下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的更多相关文章

  1. 【hive】——Hive sql语法详解

    Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的SQL查 ...

  2. 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 ...

  3. hive sql 语法详解

    Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的SQL查 ...

  4. Hadoop Hive sql语法详解

    Hadoop Hive sql语法详解 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件 ...

  5. 深入浅出Hive企业级架构优化、Hive Sql优化、压缩和分布式缓存(企业Hadoop应用核心产品)

    一.本课程是怎么样的一门课程(全面介绍)    1.1.课程的背景       作为企业Hadoop应用的核心产品,Hive承载着FaceBook.淘宝等大佬 95%以上的离线统计,很多企业里的离线统 ...

  6. Hadoop Hive sql 语法详细解释

    Hive 是基于Hadoop 构建的一套数据仓库分析系统.它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,能够将结构 化的数据文件映射为一张数据库表,并提供完整的SQL查 ...

  7. hive:join操作

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

  8. Hive SQL 分类

    题目: 请使用Hive SQL实现下面的题目. 下面是一张表名为user_buy_log的表,有三个字段,user(用户),grp(分组编号),time(购物时间). 需要将用户按照grp分组,对ti ...

  9. Hive SQL 编译过程

    转自:http://www.open-open.com/lib/view/open1400644430159.html Hive跟Impala貌似都是公司或者研究所常用的系统,前者更稳定点,实现方式是 ...

随机推荐

  1. 从头认识java-17.5 堵塞队列(以生产者消费者模式为例)

    这一章节我们来讨论一下堵塞队列.我们以下将通过生产者消费者模式来介绍堵塞队列. 1.什么是堵塞队列?(摘自于并发编程网对http://tutorials.jenkov.com/java-concurr ...

  2. 【Unity 3D】学习笔记四十二:粒子特效

    粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起.来模拟火焰,爆炸.水滴,雾气等效果. 要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system就可 ...

  3. Java图形界面实战案例——实现打字母游戏

    实现打字母的游戏 这次这个案例能够说是头几次所讲的内容的一个技术汇总,主要是 运用了几大块的知识.我们先来定义一下案例的背景:在一个300*400的窗口上.有10个随机产生的字母下落,在键盘上敲击字母 ...

  4. WebApp 开发中常用的代码片段

    其实这里面的多数都是 iOS 上面的代码.其他平台的就没有去验证了. HTML, 从HTML文档的开始到结束排列: <meta name=”viewport” content=”width=de ...

  5. 3354 [IOI2005]河流

    题目描述 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄——名叫 ...

  6. 【BZOJ4070】[Apio2015]雅加达的摩天楼 set+最短路

    [BZOJ4070][Apio2015]雅加达的摩天楼 Description 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼 ...

  7. Hibernate Criteria 查询使用

    转载 http://blog.csdn.net/woshisap/article/details/6747466 Hibernate 设计了 CriteriaSpecification 作为 Crit ...

  8. 今天在网上查看了一个socket程序,运行的时候一直报错,经过队友解决?

    1.首先是问题代码ip_port = ('192.168.12.2',8001)2.上边的代码本身没有问题,但是必须经过修改自己本机的局域网IP地址才能顺利链接请参考上一篇blog的地址,查看本机的i ...

  9. 不怕慢 就怕站 不怕单线程 不怕 裸露ip

    import sys import os import requests import threading from time import sleep from bs4 import Beautif ...

  10. office2013安装/激活

    ed2k://|file|cn_office_professional_plus_2013_x64_dvd_1134006.iso|914106368|E5FBAE9EE9CB35D5E777EA78 ...