1.什么是等值连接? 2.hive转换多表join时,如果每个表在join字句中,使用的都是同一个列,该如何处理? 3.LEFT,RIGHT,FULL OUTER连接的作用是什么? 4.LEFT或RIGHT join是连接从左边还有右边? Hive表连接的语法支持如下: Sql代码 join_table: table_reference 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 CROSS JOIN table_reference [join_condition] (as of Hive 0.10) table_reference: table_factor | join_table table_factor: tbl_name [alias] | table_subquery alias | ( table_references ) join_condition: ON equality_expression ( AND equality_expression )* equality_expression: expression = expression hive只支持等连接,外连接,左半连接。hive不支持非相等的join条件(通过其他方式实现,如left outer join),因为它很难在map/reducejob实现这样的条件。而且,hive可以join两个以上的表。 例子 写join查询时,有几个典型的点要考虑,如下: 等连接 只有等连接才允许 Sql代码 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) 这两个是合法的连接 Sql代码 SELECT a.* FROM a JOIN b ON (a.id <> b.id) 这个是不允许的。 多表连接 同个查询,可以join两个以上的表 Sql代码 SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2) join的缓存和任务转换 hive转换多表join时,如果每个表在join字句中,使用的都是同一个列,只会转换为一个单独的map/reduce。 Sql代码 SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1) 这个会转换为单独的map/reduce任务,只有b表的key1列在join被调用。 另一方面 Sql代码 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任务,因为b的key1列在第一个join条件使用,而b表的key2列在第二个join条件使用。第一个map/reduce任务join a和b。第二个任务是第一个任务的结果join c。 在join的每个map/reduce阶段,序列中的最后一个表,当其他被缓存时,它会流到reducers。所以,reducers需要缓存join关键字的特定值组成的行,通过组织最大的表出现在序列的最后,有助于减少reducers的内存。 Sql代码 SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1) 三个表,在同一个独立的map/reduce任务做join。a和b的key对应的特定值组成的行,会缓存在reducers的内存。然后reducers接受c的每一行,和缓存的每一行做join计算。 类似 Sql代码 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任务在join计算被调用。第一个是a和b做join,然后reducers缓存a的值,另一边,从流接收b的值。第二个阶段,reducers缓存第一个join的结果,另一边从流接收c的值。 在join的每个map/reduce阶段,通过关键字,可以指定哪个表从流接收。 Sql代码 SELECT /*+ STREAMTABLE(a) */ a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1) 三个表的连接,会转换为一个map/reduce任务,reducer会把b和c的key的特定值缓存在内存里,然后从流接收a的每一行,和缓存的行做join。 join的结果 LEFT,RIGHT,FULL OUTER连接存在是为了提供ON语句在没有匹配时的更多控制。例如,这个查询: Sql代码 SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key) 将会返回a的每一行。如果b.key等于a.key,输出将是a.val,b.val,如果a没有和b.key匹配,输出的行将是a.val,NULL。如果b的行没有和a.key匹配上,将被抛弃。语法"FROM a LEFT OUTER JOIN b"必须写在一行,为了理解它如何工作——这个查询,a是b的左边,a的所有行会被保持;RIGHT OUTER JOIN将保持b的所有行, FULLOUTER JOIN将会保存a和b的所有行。OUTER JOIN语义应该符合标准的SQL规范。 join的过滤 Joins发生在where字句前,所以,如果要限制join的输出,需要写在where字句,否则写在JOIN字句。现在讨论的一个混乱的大点,就是分区表 Sql代码 SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key) WHERE a.ds='2009-07-07' AND b.ds='2009-07-07' 将会连接a和b,产生a.val和b.val的列表。WHERE字句,也可以引用join的输出列,然后过滤他们。 但是,无论何时JOIN的行找到a的key,但是找不到b的key时,b的所有列会置成NULL,包括ds列。这就是说,将过滤join输出的所有行,包括没有合法的b.key的行。然后你会在LEFT OUTER的要求扑空。 也就是说,如果你在WHERE字句引用b的任何列,LEFTOUTER的部分join结果是不相关的。所以,当外连接时,使用这个语句 Sql代码 SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key AND b.ds='2009-07-07' AND a.ds='2009-07-07' join的输出会预先过滤,然后你不用对有a.key而没有b.key的行做过滤。RIGHT和FULL join也是一样的逻辑。 join的顺序 join是不可替换的,连接是从左到右,不管是LEFT或RIGHT join。 Sql代码 SELECT a.val1, a.val2, b.val, c.val FROM a JOIN b ON (a.key = b.key) LEFT OUTER JOIN c ON (a.key = c.key) 首先,连接a和b,扔掉a和b中没有匹配的key的行。结果表再连接c。这提供了直观的结果,如果有一个键都存在于A和C,但不是B:完整行(包括 a.val1,a.val2,a.key)会在"a jOINb"步骤,被丢弃,因为它不在b中。结果没有a.key,所以当它和c做LEFT OUTER JOIN,c.val也无法做到,因为没有c.key匹配a.key(因为a的行都被移除了)。类似的,RIGHTOUTER JOIN(替换为LEFT),我们最终会更怪的效果,NULL, NULL, NULL, c.val。因为尽管指定了join key是a.key=c.key,我们已经在第一个JOIN丢弃了不匹配的a的所有行。 为了达到更直观的效果,相反,我们应该从 Sql代码 FROM c LEFT OUTER JOIN a ON (c.key = a.key) LEFT OUTER JOIN b ON (c.key = b.key). LEFT SEMI JOIN实现了相关的IN / EXISTS的子查询语义的有效途径。由于Hive目前不支持IN / EXISTS的子查询,所以你可以用 LEFT SEMI JOIN 重写你的子查询语句。LEFT SEMIJOIN 的限制是, JOIN 子句中右边的表只能在 ON 子句中设置过滤条件,在 WHERE 子句、SELECT 子句或其他地方过滤都不行。 Sql代码 SELECT a.key, a.value FROM a WHERE a.key in (SELECT b.key FROM B); 可以重写为 Sql代码 SELECT a.key, a.val FROM a LEFT SEMI JOIN b on (a.key = b.key) mapjoin 但如果所有被连接的表是小表,join可以被转换为只有一个map任务。查询是 SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a join b ona.key = b.key 不需要reducer。对于每一个mapper,A和B已经被完全读出。限制是a FULL/RIGHTOUTER JOIN b不能使用。 如果表在join的列已经分桶了,其中一张表的桶的数量,是另一个表的桶的数量的整倍,那么两者可以做桶的连接。如果A有4个桶,表B有4个桶,下面的连接: Sql代码 SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a join b on a.key = b.key 只能在mapper工作。为了为A的每个mapper完整抽取B。对于上面的查询,mapper处理A的桶1,只会抽取B的桶1,这不是默认行为,要使用以下参数: Sql代码 set hive.optimize.bucketmapjoin = true; 如果表在join的列经过排序,分桶,而且他们有相同数量的桶,可以使用排序-合并 join。每个mapper,相关的桶会做连接。如果A和B有4个桶, Sql代码 SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM A a join B b on a.key = b.key 只能在mapper使用。使用A的桶的mapper,也会遍历B相关的桶。这个不是默认行为,需要配置以下参数: Sql代码 set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat; set hive.optimize.bucketmapjoin = true; set hive.optimize.bucketmapjoin.sortedmerge = true; |
- 浏览: 155625 次
文章分类
最新评论
-
cldtc:
您好,想请教一个问题,using python脚本的时候怎样打 ...
Hadoop Hive sql语法详解5--HiveQL与SQL区别
发表评论
-
【转载】Hive 数据倾斜总结
2014-07-04 16:36 838转载:http://www.tbdata.org/archi ... -
hive sql 优化
2014-06-12 15:12 908Hive是将符合SQL语法的字符串解析生成可以在Hadoop ... -
hive与hbase的十大区别与联系
2014-06-12 10:35 689共同点:1.hbase与hive都是架构在hadoop之上的。 ... -
hadoop、hbase、hive版本对应关系
2014-04-24 13:46 4263hadoop与HBase版本对应关系: Hbase Ha ... -
转-hive 优化——深入浅出学Hive
2014-04-22 11:05 632第一部分:Hadoop 计算 ... -
Hive 在多维统计分析中的应用 & 技巧总结
2014-04-22 11:00 1544多维统计一般分两种,我们看看 Hive 中如何解决: 1、 ... -
Hadoop Hive sql语法详解5--HiveQL与SQL区别
2014-04-21 19:49 53611.hive内联支持什么格式 ... -
Hadoop Hive sql语法详解4--DQL 操作:数据查询SQL
2014-04-21 19:41 14741.基本的Select 操作如何实现?2.基于Partiti ... -
让你真正明白什么是hive
2014-04-17 13:43 1161导读:对于一个事物的认识,存在几种情况1.没有接触,不知道 ... -
Hadoop Hive sql语法详解
2014-04-16 17:30 1297Hive 是基于Hadoop 构建的一套数据仓 ... -
转-Hive QL——深入浅出学Hive
2014-04-12 10:17 769目录: 初始Hive Hive安装与配置 Hive ...
相关推荐
《Hive在CDH5.9.3中的应用与详解》 Hive是Apache软件基金会的一个开源项目,它提供了一种基于Hadoop的数据仓库工具,能够将结构化的数据文件映射为一张数据库表,并提供SQL(HQL)查询功能,方便大数据的分析处理。...
在Hive中,参数配置起着非常重要的作用,它可以影响Hive的性能、安全性和执行效率。本文将对Hive的参数配置进行详细的解释,以便更好地使用Hive。 1. hive.exec.mode.local.auto 该参数决定Hive是否应该自动地根据...
在这个"Day08-Hive函数与HQL详解"的课程资料中,我们将深入探讨Hive的函数使用以及HQL的相关知识。 Hive的核心功能在于其强大的SQL接口,即HiveQL,它允许用户以结构化查询的方式操作存储在Hadoop HDFS中的非结构化...
### Hive语法详解 #### 一、安装和配置 **1.1 要求** - **硬件需求**:为了高效地运行Hive,推荐至少具备4GB内存,并且Hive服务器应该有足够的磁盘空间来存储元数据。 - **软件需求**:Hive需要Java环境支持,...
【Hive安装详解】 Hive是Apache软件基金会的一个开源项目,它提供了一个基于Hadoop的数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,使得用户可以通过类SQL的方式进行大数据处理。...
Hive中SQL详解 Hive是一个基于Hadoop构建的数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop分布式文件系统中的数据。 Hive SQL支持绝大多数的语句,如DDL、DML、聚合函数、连接查询、条件查询等。 ...
50.Hive中的数据倾斜及解决方案-三种join方式 51.Hive中的数据倾斜及解决方案-group by 52.Hive中使用正则加载数据 53. Hive中使用Python脚本进行预处理 第5章:Zeus任务资源调度工具 54.资源任务调度框架介绍 55....
- **Join的实现原理**:在Hive中,Join操作通常通过MapReduce来实现。例如,在一个内连接中,Map阶段将不同表的数据分别标记,然后在Reduce阶段,依据标记判断并合并来自不同表的记录。这种方法确保了JOIN操作的...
Hive SQL详解经典 在大数据处理领域,Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL(称为HiveQL)查询存储在Hadoop分布式文件系统(HDFS)中的大型数据集。这篇博客深入探讨了Hive SQL的使用,帮助用户...
- **操作符**:Hive执行的基本单位,每个操作符对应一个特定的功能,例如TableScanOperator负责从表中读取数据,JoinOperator负责连接两个数据集。 - **执行计划**:操作符按照一定的顺序组合而成的计划,描述了Hive...
### Hive操作指南知识点详解 #### 一、Hive概述及架构 **1.1 Hive架构** Hive架构主要由以下几个部分组成: - **用户接口**:主要包括CLI(命令行界面)、Client(客户端)以及WUI(Web用户界面)。其中CLI是最...
**大数据与云计算技术:Hadoop之Hive详解** 在当今数据驱动的世界中,大数据和云计算技术扮演着至关重要的角色。Hadoop是Apache软件基金会开发的一个开源框架,它为大规模数据处理提供了分布式存储和计算能力。而...
- **JOIN原则**:在进行JOIN操作时,应该将较小的表放置在JOIN操作符的左边,因为Hive在执行JOIN时会尝试将左侧表的内容加载到内存中,将小表放在左边有助于减少内存溢出的风险。 - **MapJoin**:对于较小的表,...
【Hive QL详解1】 Hive 是一种基于 Hadoop 的数据仓库工具,它允许用户使用 SQL-like 查询语言(Hive QL)对大规模数据集进行分析和处理。本篇文章将详细探讨Hive的几个关键方面,包括Hadoop计算框架的特性、优化...
【Hive面试知识点详解】 Hive是大数据领域中一个重要的数据仓库工具,它设计的目标是为大规模数据集提供数据查询和分析能力。由于Hive提供了类似SQL的查询语言(HQL),使得非Java背景的分析师也能轻松进行大数据...
### Hive参数优化详解 #### 一、整体架构优化 在Hive的整体架构中进行优化,主要是为了提升查询处理效率及资源利用率。以下是一些关键点: 1. **表设计**: - **分区表**:根据查询维度进行分区,如日期分区等。...
#### HIVE架构详解与Hadoop关系解析 Hive作为基于Hadoop的大数据处理框架,其架构设计旨在简化海量数据的存储、查询和分析过程。它提供了类似SQL的查询语言——HiveQL,使得传统数据库管理员能够无缝过渡到大数据...
【Hive配置详解】 Hive是基于Hadoop的数据仓库工具,它允许通过SQL-like语言对大规模数据进行查询、分析和管理。在Hive的配置过程中,我们需要关注以下几个关键步骤: 1. **安装与环境配置**: - 首先,你需要将...
本文将详细讲解如何在pandas中进行列转行的操作,类似于Hive中的explode方法,这对于处理包含列表或者数组的数据尤为有用。 首先,我们来看一个简单的例子。假设有一个DataFrame `df`,其中包含两列:`A` 和 `B`,`...