http://shiyanjun.cn/archives/588.html
生成一个MR Job
多表连接,如果多个表中每个表都使用同一个列进行连接(出现在JOIN子句中),则只会生成一个MR Job,例如:
1 |
SELECT a.val, b.val, c.val FROM a JOIN b ON (a. key = b.key1) JOIN c ON (c. key = b.key1)
|
三个表a、b、c都分别使用了同一个字段进行连接,亦即同一个字段同时出现在两个JOIN子句中,从而只生成一个MR Job。
生成多个MR Job
多表连接,如果多表中,其中存在一个表使用了至少2个字段进行连接(同一个表的至少2个列出现在JOIN子句中),则会至少生成2个MR Job,例如:
1 |
SELECT a.val, b.val, c.val FROM a JOIN b ON (a. key = b.key1) JOIN c ON (c. key = b.key2)
|
三个表基于2个字段进行连接,这两个字段b.key1和b.key2同时出现在b表中。连接的过程是这样的:首先a和b表基于a.key和b.key1进行连接,对应着第一个MR Job;表a和b连接的结果,再和c进行连接,对应着第二个MR Job。
表连接顺序优化
多表连接,会转换成多个MR Job,每一个MR Job在Hive中称为JOIN阶段(Stage)。在每一个Stage,按照JOIN顺序中的最后一个表应该尽量是大表,因为JOIN前一阶段生成的数据会存在于Reducer的buffer中,通过stream最后面的表,直接从Reducer的buffer中读取已经缓冲的中间结果数据(这个中间结果数据可能是JOIN顺序中,前面表连接的结果的Key,数据量相对较小,内存开销就小),这样,与后面的大表进行连接时,只需要从buffer中读取缓存的Key,与大表中的指定Key进行连接,速度会更快,也可能避免内存缓冲区溢出。例如:
1 |
SELECT a.val, b.val, c.val FROM a JOIN b ON (a. key = b.key1) JOIN c ON (c. key = b.key1)
|
这个JOIN语句,会生成一个MR Job,在选择JOIN顺序的时候,数据量相比应该是b < c,表a和b基于a.key = b.key1进行连接,得到的结果(基于a和b进行连接的Key)会在Reducer上缓存在buffer中,在与c进行连接时,从buffer中读取Key(a.key=b.key1)来与表c的c.key进行连接。
另外,也可以通过给出一些Hint信息来启发JOIN操作,这指定了将哪个表作为大表,从而得到优化。例如:
1 |
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)
|
上述JOIN语句中,a表被视为大表,则首先会对表b和c进行JOIN,然后再将得到的结果与表a进行JOIN。
基于条件的LEFT OUTER JOIN优化
左连接时,左表中出现的JOIN字段都保留,右表没有连接上的都为空。对于带WHERE条件的JOIN语句,例如:
1 |
SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a. key =b. key )
|
2 |
WHERE a.ds= '2009-07-07' AND b.ds= '2009-07-07'
|
执行顺序是,首先完成2表JOIN,然后再通过WHERE条件进行过滤,这样在JOIN过程中可能会输出大量结果,再对这些结果进行过滤,比较耗时。可以进行优化,将WHERE条件放在ON后,例如:
1 |
SELECT a.val, b.val FROM a LEFT OUTER JOIN b
|
2 |
ON (a. key =b. key AND b.ds= '2009-07-07' AND a.ds= '2009-07-07' )
|
这样,在JOIN的过程中,就对不满足条件的记录进行了预先过滤,可能会有更好的表现。
左半连接(LEFT SEMI JOIN)
左半连接实现了类似IN/EXISTS的查询语义,使用关系数据库子查询的方式实现查询SQL,例如:
1 |
SELECT a. key , a.value FROM a WHERE a. key IN ( SELECT b. key FROM b);
|
使用Hive对应于如下语句:
1 |
SELECT a. key , a.val FROM a LEFT SEMI JOIN b ON (a. key = b. key )
|
需要注意的是,在LEFT SEMI JOIN中,表b只能出现在ON子句后面,不能够出现在SELECT和WHERE子句中。
关于子查询,这里提一下,Hive支持情况如下:
- 在0.12版本,只支持FROM子句中的子查询;
- 在0.13版本,也支持WHERE子句中的子查询。
Map Side JOIN
Map Side JOIN优化的出发点是,Map任务输出后,不需要将数据拷贝到Reducer节点,降低的数据在网络节点之间传输的开销。
多表连接,如果只有一个表比较大,其他表都很小,则JOIN操作会转换成一个只包含Map的Job,例如:
1 |
SELECT /*+ MAPJOIN(b) */ a. key , a.value FROM a JOIN b ON a. key = b. key
|
对于表a数据的每一个Map,都能够完全读取表b的数据。这里,表a与b不允许执行FULL OUTER JOIN、RIGHT OUTER JOIN。
BUCKET Map Side JOIN
我们先看两个表a和b的DDL,表a为:
1 |
CREATE TABLE a( key INT , othera STRING)
|
2 |
CLUSTERED BY ( key ) INTO 4 BUCKETS
|
3 |
ROW FORMAT DELIMITED |
4 |
FIELDS TERMINATED BY '\001'
|
5 |
COLLECTION ITEMS TERMINATED BY '\002'
|
6 |
MAP KEYS TERMINATED BY '\003'
|
7 |
STORED AS SEQUENCEFILE;
|
表b为:
1 |
CREATE TABLE b( key INT , otherb STRING)
|
2 |
CLUSTERED BY ( key ) INTO 32 BUCKETS
|
3 |
ROW FORMAT DELIMITED |
4 |
FIELDS TERMINATED BY '\001'
|
5 |
COLLECTION ITEMS TERMINATED BY '\002'
|
6 |
MAP KEYS TERMINATED BY '\003'
|
7 |
STORED AS SEQUENCEFILE;
|
现在要基于a.key和b.key进行JOIN操作,此时JOIN列同时也是BUCKET列,JOIN语句如下:
1 |
SELECT /*+ MAPJOIN(b) */ a. key , a.value FROM a JOIN b ON a. key = b. key
|
并且表a有4个BUCKET,表b有32个BUCKET,默认情况下,对于表a的每一个BUCKET,都会去获取表b中的每一个BUCKET来进行JOIN,这回造成一定的开销,因为只有表b中满足JOIN条件的BUCKET才会真正与表a的BUCKET进行连接。
这种默认行为可以进行优化,通过改变默认JOIN行为,只需要设置变量:
1 |
set hive.optimize.bucketmapjoin = true
|
这样,JOIN的过程是,表a的BUCKET 1只会与表b中的BUCKET 1进行JOIN,而不再考虑表b中的其他BUCKET 2~32。
如果上述表具有相同的BUCKET,如都是32个,而且还是排序的,亦即,在表定义中在CLUSTERED BY(key)后面增加如下约束:
1 |
SORTED BY ( key )
|
则上述JOIN语句会执行一个Sort-Merge-Bucket (SMB) JOIN,同样需要设置如下参数来改变默认行为,优化JOIN时只遍历相关的BUCKET即可:
1 |
set hive.input. format =org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
|
2 |
set hive.optimize.bucketmapjoin = true ;
|
3 |
set hive.optimize.bucketmapjoin.sortedmerge = true ;
|
相关推荐
通过这个工具,用户可以在图形化的用户界面中进行远程连接,查看和操作Hive的数据表,执行HQL查询,以及进行数据导入导出等操作。SQuirreL SQ Client的特性包括自定义视图、保存查询、结果集的导出等,对于开发人员...
Hive 远程连接详细配置 Hive 远程连接是指 Hive 客户端与 Hive 服务器的连接,以便在分布式环境中实现数据仓库的管理和分析。在这个过程中,Hive 客户端与 Hive 服务器之间的连接是通过 Thrift 协议实现的。在这个...
4. **元数据管理**:Kettle 可以通过 Hive 连接获取表的元数据信息,如字段名、数据类型和表结构,以便于在 ETL 流程中正确处理数据。 5. **数据预览和调试**:Kettle 提供数据预览功能,允许用户在执行 ETL 之前...
3. **Spring MVC集成**:在`JdbcListener.java`中,我们可以实现Spring的`ApplicationListener`接口,监听`ContextRefreshedEvent`,这样当Spring应用启动时,会自动进行Kerberos认证并建立Hive连接。 4. **Java...
2. **Hive连接方式** 要连接到Hive,首先需要知道Hive服务器的地址、端口、用户名和密码。Hive可以通过Thrift协议暴露服务,通常使用HTTP或HTTPS作为传输层,因此连接字符串可能形如`jdbc:hive2://hostname:port/;...
hive连接工具waterdrop4.2免认证
如`HiveExternalCatalog`用于与Hive Metastore交互,`HiveShim`处理Hive版本之间的差异,`HiveContext`是Spark与Hive交互的主要入口,它封装了创建Hive连接、解析HQL等操作。 此外,值得注意的是,由于Spark的弹性...
在IT行业中,尤其是在大数据处理领域,Hive是一个广泛使用...这通常涉及设置Hive的连接参数,指定要删除的表的条件,以及运行相应的Java程序或启动GUI。在执行过程中,用户应谨慎操作,遵循最佳实践,以保护数据安全。
接下来,我们来看看如何在PHP中实现Hive连接: 1. **安装Thrift**:你需要下载和安装Thrift库,包括其PHP绑定。这通常涉及到编译Thrift源码,并确保生成的PHP扩展被添加到PHP配置中。 2. **生成PHP客户端代码**:...
标题中的“大数据hive连接工具dbeaver-5.3和对应驱动”指的是在大数据处理领域,使用Hive作为数据仓库工具时,用Dbeaver作为图形化的数据库管理界面进行连接和操作。Dbeaver是一款跨平台的数据库管理和开发工具,...
在Java代码中,你可以使用`Class.forName()`方法加载Hive JDBC驱动,然后通过`DriverManager.getConnection()`创建Hive连接。例如: ```java Class.forName("org.apache.hive.jdbc.HiveDriver"); Connection con = ...
1. **配置Spark连接Hive**:在Spark中,需要设置`hive.metastore.uris`等相关配置,以连接到Hive Metastore,获取Hive表的信息。 2. **读取Hive表**:使用Spark SQL的`spark.read.format("hive").load()`语句加载...
总结来说,“数据库工具连接Hive的驱动包”是连接Hive和数据库管理工具的桥梁,它的正确配置和使用对于高效的数据操作至关重要。了解并掌握这些知识点,有助于我们在大数据环境中更便捷地进行数据管理和分析工作。
本篇文章将详细讲解如何通过Impala JDBC连接到Hive库,并介绍相关的POM配置。 首先,让我们理解JDBC。JDBC是Java中用于与各种数据库交互的一套标准API,它允许Java开发者使用SQL语句来操作数据库。对于Hive和Impala...
hive2.3.2 JDBC连接 ,sql developer可用。选择第三方jdbc,加入,就可以显示hive连接。用的cloudra的jdbc用于连接操作数据库,java开发请使用maven获取开源组件。
项目文件"SparkOnHiveToEs_v1"可能包含了实现上述步骤的Java源代码,包括Spark配置、Hive连接、数据处理逻辑和ElasticSearch的写入操作。通过阅读和理解这些代码,可以深入学习如何在实际项目中整合这些技术。 ...
Idea连接Hive,Idea连接Hive,Idea连接Hive,Idea连接Hive,Idea连接Hive
因此,Kettle需要这个驱动来连接到存储Hive元数据的MySQL数据库,以便获取表定义和其他相关信息。 5. **lib文件夹**: 压缩包中的"lib"文件夹通常包含所有这些必要的JAR包。在Kettle中,这些JAR包需要被添加到...
要使用DBeaver连接到Hive 2.1.1,你需要确保安装了所有必要的JAR文件,这些文件提供了与Hive服务器通信的驱动程序和库。 Hive 2.1.1的连接依赖于以下关键组件: 1. **Hive JDBC驱动**:这是Java Database ...
"hive连接所需jar包"是针对这个需求的一个资源集合,据描述,这个压缩包包含了连接Hive所必需的、经过测试的JAR文件。 Hive的运行依赖于Java环境,并且与Hadoop生态系统的其他组件如HDFS、HBase、Zookeeper等紧密...