[Hive_add_5] Hive 的 join 操作
0. 说明
在 Hive 中进行 join 操作
1. 操作步骤
1.0 建表
在 hiveserver2 服务启动的前提下,在 Beeline客户端中输入以下命令
# 新建顾客表
create table customers(id int, name string, age int) row format delimited fields terminated by '\t'; # 新建订单表
create table orders(oid int, oname string, oprice float, uid int) row format delimited fields terminated by '\t';
1.1 创建并插入数据
创建,略
插入命令如下:
# 插入顾客数据
load data local inpath '/home/centos/files/customers.txt' into table customers; # 插入订单数据
load data local inpath '/home/centos/files/orders.txt' into table orders;
1.2 使用 join
# 内连接
select a.id, a.name, b.oname, b.oprice from customers a inner join orders b on a.id=b.uid;
# 左外连接
select a.id, a.name, b.oname, b.oprice from customers a left outer join orders b on a.id=b.uid;
# 右外连接
select a.id, a.name, b.oname, b.oprice from customers a right outer join orders b on a.id=b.uid;
# 全外连接
select a.id, a.name, b.oname, b.oprice from customers a full outer join orders b on a.id=b.uid;
2. join 的分类与优化
2.1 普通 join
select a.id, a.name, b.orderno, b.oprice from customers a inner join orders b on a.id=b.cid;
a inner join b // 返回行数 a ∩ b
a left [outer] join b // 返回行数 a
a right [outer] join b // 返回行数 b
a full [outer] join b // 返回行数 a+b - (a ∩ b)
a cross join b // 返回行数 a * b
2.2 特殊 join 优化
map join
小表+大表 => 将小表加入到分布式缓存,通过迭代大表所有数据进行处理
在老版的 Hive 中(0.7)之前,所有的 join 操作都是在 reduce 端执行的(reduce 端 join)
想要进行 map 端 join,需要进行以下操作
SET hive.auto.convert.join=true;
声明暗示 a join b , a小表,b大表
/*+ mapjoin(小表) */
SELECT /*+ MAPJOIN(a) */ a.id, a.name, b.orderno, b.oprice from customers a inner join orders b on a.id=b.cid;
在新版 Hive 中,如果想要进行 map 端 join
jdbc:hive2://> SET hive.auto.convert.join=true; //设置自动转换成 map 端 join
jdbc:hive2://> SET hive.mapjoin.smalltable.filesize=600000000; //设置 map 端 join 中小表的最大值,默认25M
common join
即 reduce 端 join
1. 声明暗示,指定大表
/*+ STREAMTABLE(大表) */
2. 将大表放在右侧
2.3 测试
测试:customers 和 orders
1. 不写任何暗示,观察是 map 端 join 还是 reduce join
SELECT a.no, a.name, b.oname, b.oprice from customers a inner join orders b on a.no=b.uid;
2. 写暗示,观察效果
SELECT /*+ MAPJOIN(a) */ a.no, a.name, b.oname, b.oprice from customers a inner join orders b on a.no=b.uid;
3. 将自动转换 map join 设置成 false
SET hive.auto.convert.join=false;
4. 写 reduce 端 join 的暗示,观察结果
SELECT /*+ STREAMTABLE(a) */ a.no, a.name, b.oname, b.oprice from customers a inner join orders b on a.no=b.uid;
[Hive_add_5] Hive 的 join 操作的更多相关文章
- hive:join操作
hive的多表连接,都会转换成多个MR job,每一个MR job在hive中均称为Join阶段.按照join程序最后一个表应该尽量是大表,因为join前一阶段生成的数据会存在于Reducer 的bu ...
- Hive中JOIN操作
1. 只支持相等JOIN. 2. 多表连接当使用不同的列进行JOIN时,会产生多个MR作业. 3. 最后的表的数据是从流中读取,而前面的会在内存中缓存,因此最好把最大的表放在最后. SELECT /* ...
- hive中的子查询改join操作(转)
这些子查询在oracle和mysql等数据库中都能执行,但是在hive中却不支持,但是我们可以把这些查询语句改为join操作: -- 1.子查询 select * from A a where a.u ...
- 使用MapReduce实现join操作
在关系型数据库中,要实现join操作是非常方便的,通过sql定义的join原语就可以实现.在hdfs存储的海量数据中,要实现join操作,可以通过HiveQL很方便地实现.不过HiveQL也是转化成 ...
- 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 ...
- MapReduce 实现数据join操作
前段时间有一个业务需求,要在外网商品(TOPB2C)信息中加入 联营自营 识别的字段.但存在的一个问题是,商品信息 和 自营联营标示数据是 两份数据:商品信息较大,是存放在hbase中.他们之前唯一的 ...
- Hive中Join的原理和机制
转自:http://lxw1234.com/archives/2015/06/313.htm 笼统的说,Hive中的Join可分为Common Join(Reduce阶段完成join)和Map Joi ...
- hive的join
第一:在map端产生join mapJoin的主要意思就是,当链接的两个表是一个比较小的表和一个特别大的表的时候,我们把比较小的table直接放到内存中去,然后再对比较大的表格进行m ...
- hive的join查询
hive的join查询 语法 join_table: table_reference [INNER] JOIN table_factor [join_condition] | table_refere ...
随机推荐
- es6入门3--箭头函数与形参等属性的拓展
对函数拓展兴趣更大一点,优先看,前面字符串后面再说,那些API居多,会使用能记住部分就好. 一.函数参数可以使用默认值 1.默认值生效条件 在变量的解构赋值就提到了,函数参数可以使用默认值了.正常我们 ...
- 手把手使用Docker搭建SpringBoot微服务镜像
一.环境准备 1.安装好Docker环境的Linux机器(安装教程) 2.准备好SpringBoot项目打包好的可运行jar包 二.编写Dockerfile 1.首先将SpringBoot打包好的ja ...
- Jenkins入门之任务基本操作
首先先简单讲一下Jenkins构建任务各种图标的含义 我的主界面有以下构建任务,这里前两列都是图标,第一列为构建的状态,前面已经讲过蓝色代表成功,红色代表失败.当然那是针对一次构建,一个构建任务可能有 ...
- python按引用赋值和深、浅拷贝
按引用赋值而不是拷贝副本 在python中,无论是直接的变量赋值,还是参数传递,都是按照引用进行赋值的. 在计算机语言中,有两种赋值方式:按引用赋值.按值赋值.其中按引用赋值也常称为按指针传值(当然, ...
- HDFS简单测试
使用Hadoop的Java客户端API操作分布式文件系统#获取文件系统实现//hdfs://master01:9000/FileSystem get(URI uri[,Configuration co ...
- 使用JS模拟锚点跳转
A-HTML锚点定义: 设置锚: <a href="#mao">&nsbp;</a> 设置点:(为了浏览器兼容性,id和name一起设置) < ...
- .NET记录-获取外网IP以及判断该IP是属于网通还是电信
在工作时,需要获取服务器公网IP(外网IP),并且判断该IP地址是属于网通还是电信.花时间整理一下,自己实现的代码,以及后续遇到的问题. /// <summary> /// 获取外网IP ...
- 路由器动态DNS设置
路由器中的动态DNS设置非常的简单,只需要注册动态域名服务商的账号,然后在路由器中登录该账号就可以了 一.路由器动态DNS作用 无线路由器连接宽带上网后,路由器会从宽带运营商那里获取一个IP地址,这个 ...
- C#一个窗体调用另一个窗体的方法
一个窗体调用另一个窗体的方法:例如:窗体B要调用窗体A中的方法1.首先在窗体A中将窗体A设为静态窗体public static FormA m_formA; //设此窗体为静态,其他窗体可调用此 ...
- 【微服务No.3】AOP组件ASPectCore简单使用
介绍: AspectCore是.NET标准的基于AOP的跨平台框架[github解释].主要支持:对方面拦截器,依赖注入集成,Web应用程序,数据验证等的核心支持. 使用实例: 首先安装dll: In ...