Hive表连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);  

以上是关于Hive表连接的主要内容,如果未能解决你的问题,请参考以下文章

Hive表连接

Hive分区表简介

Hive 外部表架构重新连接

Hive 多次与自身连接表

Hive 使用分区连接表

Hive - 两个表的高效连接