文档章节

Hive连接查询join用法详解

i
 iamchenli
发布于 2017/02/24 20:32
字数 965
阅读 2496
收藏 8

先来个总的概括,Hive的join用法基本与SQL一致

建表语句不说了,直接看看两个表中的数据

表一:cl_student

hive (test)> select * from cl_student;
OK
1	chenli	21
2	xuzeng	22
3	xiaodan	23
4	hua	24

表2:cl_stu_sub

hive (test)> select * from cl_stu_sub;
OK
1	chinese
2	english
3	science
5	nature

1、内连接。inner join,即基于on语句,仅列出表1和表2符合连接条件的数据。

hive (test)> select a.*,b.* from cl_student a join cl_stu_sub b on a.id=b.id;
1	chenli	21	1	chinese
2	xuzeng	22	2	english
3	xiaodan	23	3	science

hive (test)> select a.*,b.* from cl_student a,cl_stu_sub b where a.id=b.id;
1	chenli	21	1	chinese
2	xuzeng	22	2	english
3	xiaodan	23	3	science

第一条语句与第二条SQL条语句的效果是一样的

 

2、左连接。左连接是显示左边的表的所有数据,如果有右边表与之对应,则显示;否则显示NULL

hive (test)> select a.*,b.* from cl_student a left outer join cl_stu_sub b on a.id=b.id;
1	chenli	21	1	chinese
2	xuzeng	22	2	english
3	xiaodan	23	3	science
4	hua	24	NULL	NULL

深入了解,比较两者的不同,在上述语句中增加了一个where条件或者是and的条件

on条件会产生一个临时表,where条件是对这个临时表进行过滤

hive (test)> select a.*,b.* from cl_student a left outer join cl_stu_sub b on a.id=b.id where b.name='chinese';
1	chenli	21	1	chinese

hive (test)>select a.*,b.* from cl_student a left outer join cl_stu_sub b on a.id=b.id where a.name='chenli';
1	chenli	21	1	chinese

标准查询关键字执行顺序为 from->where->group by->having->order by

on是先对表进行筛选后再关联的,left关联则on对右表才有效的,左表都是要选出来的

如果是要条件查询后才连接应该把查询件放置于ON后。如果是想再连接完毕后才筛选就应把条件放置于where后面,对主表的帅选要用where条件

hive (test)>select a.*,b.* from cl_student a left outer join cl_stu_sub b where a.id=b.id;
1	chenli	21	1	chinese
2	xuzeng	22	2	english
3	xiaodan	23	3	science

hive (test)>select a.*,b.* from cl_student a left outer join cl_stu_sub b on a.id=b.id and a.name='chenli';
1	chenli	21	1	chinese
2	xuzeng	22	NULL	NULL
3	xiaodan	23	NULL	NULL
4	hua	24	NULL	NULL

hive (test)>select a.*,b.* from cl_student a left outer join cl_stu_sub b on a.id=b.id and b.name='chinese';
1	chenli	21	1	chinese
2	xuzeng	22	NULL	NULL
3	xiaodan	23	NULL	NULL
4	hua	24	NULL	NULL

 

 

3、右连接.与左连接同理

hive (test)> select a.*,b.* from cl_student a right outer join cl_stu_sub b on a.id=b.id;
1	chenli	21	1	chinese
2	xuzeng	22	2	english
3	xiaodan	23	3	science
NULL	NULL	NULL	5	nature

 

4、全连接。相当于表1和表2的数据都显示,如果没有对应的数据,则显示NULL

hive (test)> select a.*,b.* from cl_student a full outer join cl_stu_sub b on a.id=b.id;
1	chenli	21	1	chinese
2	xuzeng	22	2	english
3	xiaodan	23	3	science
4	hua	24	NULL	NULL
NULL	NULL	NULL	5	nature

 

5、左半开连接。left semi join,语法与左连接不一样,只能选择出左边表的数据,此数据符合on后面的条件。

semi join通常比inner join的效率更高

hive (test)>select a.* from cl_student a left semi join cl_stu_sub b on a.id=b.id;
1	chenli	21
2	xuzeng	22
3	xiaodan	23


hive (test)>select * from cl_student a left semi join cl_stu_sub b on a.id=b.id;
1	chenli	21
2	xuzeng	22
3	xiaodan	23

hive (test)>select a.*,b.* from cl_student a left semi join cl_stu_sub b on a.id=b.id;
FAILED: SemanticException [Error 10009]: Line 1:11 Invalid table alias 'b'

 

6、Hive不支持右半开连接

 

7、笛卡尔积join

笛卡尔积是一种连接,表示左边表的行数乘以右边表的行数。

hive (test)>select a.*,b.* from cl_student a join cl_stu_sub b;
1	chenli	21	1	chinese
1	chenli	21	2	english
1	chenli	21	3	science
1	chenli	21	5	nature
2	xuzeng	22	1	chinese
2	xuzeng	22	2	english
2	xuzeng	22	3	science
2	xuzeng	22	5	nature
3	xiaodan	23	1	chinese
3	xiaodan	23	2	english
3	xiaodan	23	3	science
3	xiaodan	23	5	nature
4	hua	24	1	chinese
4	hua	24	2	english
4	hua	24	3	science
4	hua	24	5	nature

 

© 著作权归作者所有

i
粉丝 11
博文 54
码字总数 22119
作品 0
广州
程序员
私信 提问
加载中

评论(1)

the8thday
the8thday
通透
Hive从入门到实战视频教程【40讲全】

1、Hive是什么,Hive的体系结构,Hive和Hadoop的关系 2、Hive的元数据存储、Hive的数据存储、Hive和RDBMS的区别 3、JDK安装 4、Hadoop集群搭建-1 5、Hadoop集群搭建-2 6、Hadoop集群搭建-3 ...

tom先生
2014/11/26
48
0
Hive配置项的含义详解

hive的配置: hive.ddl.output.format:hive的ddl语句的输出格式,默认是text,纯文本,还有json格式,这个是0.90以后才出的新配置; hive.exec.script.wrapper:hive调用脚本时的包装器,默...

bluz
2016/09/13
158
0
Hive QL详解

java私塾Hive QL详解 第一部分:Hadoop 计算框架的特性 什么是数据倾斜 •由于数据的不均衡原因,导致数据分布不均匀,造成数据大量的集中到一点,造成数据热点 Hadoop框架的特性 •不怕数据...

空呗
2014/01/09
538
0
图文并茂详解 SQL JOIN

Join是关系型数据库系统的重要操作之一,一般关系型数据库中包含的常用Join:内联接、外联接和交叉联接等。如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的数据,这...

大数据之路
2013/05/31
6.8K
5
Hive SQL 编译过程详解

Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用。美团数据仓库也是基于Hive搭建,每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析。Hive的稳定性和性能对...

大数据之路
2014/05/21
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

移动开发中的 Web:WebView、WebKit、JSCore、Web 优化、热修复、跨平台、Native、Hybrid……

移动开发领域近年来已经逐渐告别了野蛮生长的时期,进入了相对成熟的时代。而一直以来 Native 和 Web 的争论从未停止,通过开发者孜孜不倦的努力,Web 的效率和 Native 的体验也一直在寻求着...

编辑部的故事
8分钟前
6
0
MySQL8.0.17 - Multi-Valued Indexes 简述

本文主要简单介绍下8.0.17新引入的功能multi-valued index, 顾名思义,索引上对于同一个Primary key, 可以建立多个二级索引项,实际上已经对array类型的基础功能做了支持 (感觉官方未来一定...

阿里云官方博客
54分钟前
5
0
make4.1降级 make-3.81、2错误

在编译 make-3.82 的时候出现如下错误提示 glob/glob.c:xxx: undefined reference to `__alloca'` 修改 /glob/glob.c // #if !defined __alloca && !defined __GNU_LIBRARY__ # ifdef __GNUC......

Domineering
56分钟前
13
0
Rainbond集群的安装和运维的原理

本文将解读Rainbond集群的安装和运维的原理,使用户基本了解Rainbond的安装机制和运维重点,便于用户搭建大型Rainbond集群。 1.Rainbond集群节点概述 1.1 节点分类 属性 类型 说明 manage 管...

好雨云帮
今天
9
0
好程序员大数据学习路线分享UDF函数

1.为什么需要UDF? 1)、因为内部函数没法满足需求。 2)、hive它本身就是一个灵活框架,允许用自定义模块功能,如可以自定义UDF、serde、输入输出等。 2.UDF是什么? UDF:user difine fun...

好程序员官方
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部