Hive表连接

Hive中表连接操作大致分为以下四种:

1:join即等值连接,只有某个值在两个表中同时存在才会被检索出来。

2:left outer join即左外连接,左边表中的值无论是否存在右表中,都会输出,但是右表中的记录只有在左表中存在时才会输出。

3:right outer join即右外连接,右边表中的值无论是否存在左表中,都会输出,但是左表中的记录只有在右边中存在时才会输出(和left outer join相反)。

4:left semi join即左半连接,类似于exits。

下面我们通过具体的例子来说明这几种连接操作:

#user表中的数据如下:

[java] view plain copy

  1. hive (hive)> select * from user;
  2. OK
  3. id  name
  4. 1   lavimer
  5. 2   liaozhongmin
  6. 3   liaozemin
  7. Time taken: 0.112 seconds

#post表中的数据如下:

[java] view plain copy

  1. hive (hive)> select * from post;
  2. OK
  3. uid pid title
  4. 1   1   Thinking in Java
  5. 1   2   Thinking in Hadoop
  6. 2   3   Thinking in C
  7. 4   4   Thinking in Hive
  8. 5   5   Thinking in HBase
  9. 5   6   Thinking in Pig
  10. 5   7   Thinking in Flume
  11. Time taken: 0.11 seconds

一:等值连接

[java] view plain copy

  1. hive (hive)> select s.id,s.name,t.pid,t.title from
  2. > (select id,name from user) s
  3. > join
  4. > (select uid,pid,title from post) t
  5. > on s.id=t.uid;

查询出来的结果如下:

[java] view plain copy

  1. id  name    pid title
  2. 1   lavimer 1   Thinking in Java
  3. 1   lavimer 2   Thinking in Hadoop
  4. 2   liaozhongmin    3   Thinking in C

二:左外连接

[java] view plain copy

  1. hive (hive)>
  2. > select s.id,s.name,t.pid,t.title from
  3. > (select id,name from user) s
  4. > left outer join
  5. > (select uid,pid,title from post) t
  6. > on s.id=t.uid;

查询出来的结果如下:

[java] view plain copy

  1. id  name    pid title
  2. 1   lavimer 1   Thinking in Java
  3. 1   lavimer 2   Thinking in Hadoop
  4. 2   liaozhongmin    3   Thinking in C
  5. 3   liaozemin   NULL    NULL

注:从上面的结果可以看出,post表的uid只有在user表中存在时才会输出记录,否则输出NULL。

三:右外连接

[java] view plain copy

  1. hive (hive)> select s.id,s.name,t.pid,t.title from
  2. > (select id,name from user) s
  3. > right outer join
  4. > (select uid,pid,title from post) t
  5. > on s.id=t.uid;

查询出来的结果如下:

[java] view plain copy

  1. id  name    pid title
  2. 1   lavimer 1   Thinking in Java
  3. 1   lavimer 2   Thinking in Hadoop
  4. 2   liaozhongmin    3   Thinking in C
  5. NULL    NULL    4   Thinking in Hive
  6. NULL    NULL    5   Thinking in HBase
  7. NULL    NULL    6   Thinking in Pig
  8. NULL    NULL    7   Thinking in Flume

注:从上面的结果可以看出,user表中的id只有在post表中存在时才会输出记录,否则输出NULL。

四:左半连接

[java] view plain copy

  1. hive (hive)> select s.id,s.name from
  2. > (select id,name from user) s
  3. > left semi join
  4. > (select uid,pid,title from post) t
  5. > on s.id=t.uid;

查询出来的结果如下:

[java] view plain copy

  1. id  name
  2. 1   lavimer
  3. 2   liaozhongmin

这个left semi join比较有意思,因为Hive中没有in/exits这样的子句,但是我们有需要这样的操作,所以Hive将这种类型的子句转换成left semi join。

上面的语句可以简写为如下形式:

[java] view plain copy

  1. hive (hive)> select user.id,user.name from user
  2. > left semi join
  3. > post
  4. > on (user.id=post.uid);

上面的HQL语句等价于下面的SQL语句:

[java] view plain copy

    1. select id,name from user
    2. where id in
    3. (select uid from post);
时间: 2024-08-14 18:52:36

Hive表连接的相关文章

Hive的join表连接查询的一些注意事项

Hive支持的表连接查询的语法: 1 join_table: 2 table_reference JOIN table_factor [join_condition] 3 | table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition 4 | table_reference LEFT SEMI JOIN table_reference join_condition 5 | table_referenc

连接Oracle与Hadoop(4) Oracle使用OSCH访问Hive表

OSCH是Oracle SQL Connector for Hadoop的缩写,Oracle出品的大数据连接器的一个组件 本文介绍的就是如何使用OSCH从Oracle数据库直接访问Hive表 前提1:在Oracle数据库端,部署好HDFS客户端与OSCH软件,设置好环境变量 #JAVA export JAVA_HOME=/home/oracle/jdk1.8.0_65   #Hadoop export HADOOP_USER_NAME=hadoop export HADOOP_HOME=/hom

hive表数据导出到csv乱码原因及解决方案

转载自http://blog.csdn.net/lgdlxc/article/details/42126225 Hive表中的数据使用hive - e"select * from table">aa.csv导出到csv文件的时候在window中用Excel打开查看的时候是乱码,而且格式也不对. 原因有下面两个: 1.乱码的原因是用excel打开csv时格式默认为gbk,但是从hive中导出来的是utf8的 2.格式不对的原因是csv文件的列分隔符是逗号或者\t,而hive中默认使

flume的sink写入hive表

a1.sources = r1 a1.sinks = s1 a1.channels = c1 a1.sources.r1.type = netcat      a1.sources.r1.bind = localhost  a1.sources.r1.port = 44444 a1.sinks.s1.type = hive a1.sinks.s1.type.hive.metastore=thrift://master:9083 a1.sinks.s1.type.hive.datebase=bd1

hive 表的常用操作

使用load 方式加载数据到Hive 表中,注意分区表加载数据的特殊性 如何保存HiveQL 查询结果:保存到表中,保存到本地文件(注意指定列分隔符) 常见查询练习,如group by.having.join.sort by.order by 等. 一:hive 表的操作 1.1.1 hive的库的创建与数据库的查看: hive(default)> create database yangyang; hive(default)> use yangyang; hive(yangyang)>

好程序员大数据学习路线之hive表的查询

好程序员大数据学习路线之hive表的查询 1.join 查询 1.永远是小结果集驱动大结果集(小表驱动大表,小表放在左表). 2.尽量不要使用join,但是join是难以避免的. left join . left outer join . left semi join(左半开连接,只显示左表信息) hive在0.8版本以后开始支持left join left join 和 left outer join 效果差不多 hive的join中的on只能跟等值连接 "=",不能跟< &g

SQL Server三种表连接原理

http://msdn.microsoft.com/zh-cn/library/dn144699.aspx 简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge Join,Hash Join这三种物理连接中的一种.理解这三种物理连接是理解在表连接时解决性能问题的基础,下面我来对这三种连接的原理,适用场景进行描述. 嵌套循环连接(Nested Loop J

每天一点数据库之-----Day 9 表连接

每天一点数据库之-----Day 9 表连接 ----转载请注明出处:coder-pig 本节引言: 前面我们学习的都是针对一个表来进行操作的,上一节虽然学了UNION这个可以操作多个表 的关键字,但是又有两个限制(查询字段数目与数据类型要相同),本节就来学习通过表连接 来操作多个表!而表连接又有四种: 内连接,外连接,交叉连接与自连接,那么接下来开始本节学习! 数据准备: 在开始学习前,我们先准备一些数据,建三个表:T_Stu,T_Class,T_Dorm 建T_Stu表: CREATE TA

表连接查询与where后使用子查询的性能分析。

子查询就是在一条查询语句中还有其它的查询语句,主查询得到的结果依赖于子查询的结果. 子查询的子语句可以在一条sql语句的FROM,JOIN,和WHERE后面,本文主要针对在WHERE后面使用子查询与表连接查询的性能做出一点分析. 对于表连接查询和子查询性能的讨论众说纷纭,普遍认为的是表连接查询的性能要高于子查询.本文将从实验的角度,对这两种查询的性能做出验证,并就实验结果分析两种查询手段的执行流程对性能的影响. 首先准备两张表 1,访问日志表mm_log有150829条记录(相关sql文件已放在