Hive Join详解

最近对hive的join用的比较多,特地归纳下常用的各种连接,看看hive的连接和我们普通的是否有不同。创建ta.txt和tb.txt两个文件,加载数据:

hive (cfpd_ods_safe)> load data local inpath 
      '/data/bdp/bdp_etl_deploy/hduser06/jaysonding/ta.txt' into table ta;
hive (cfpd_ods_safe)> load data local inpath 
      '/data/bdp/bdp_etl_deploy/hduser06/jaysonding/tb.txt' into table tb;

          查询数据:

hive (cfpd_ods_safe)> select * from ta;
OK
ta.uid
1111
2222
3333
4444
Time taken: 0.087 seconds, Fetched: 4 row(s)
hive (cfpd_ods_safe)> select * from tb;
OK
tb.uid
1111
2222
5555
Time taken: 0.183 seconds, Fetched: 3 row(s)

            现在尝试来连接了。

(1)普通的,连接:

ta.uid  tb.uid
1111    1111
1111    2222
1111    5555
2222    1111
2222    2222
2222    5555
3333    1111
3333    2222
3333    5555
4444    1111
4444    2222
4444    5555
Time taken: 21.328 seconds, Fetched: 12 row(s)

           可见普通逗号,不带条件结果就是一个笛卡尔积。再看带条件的:

hive (cfpd_ods_safe)> select * from ta,tb where ta.uid=tb.uid;
ta.uid  tb.uid
1111    1111
2222    2222
Time taken: 23.147 seconds, Fetched: 2 row(s)

(2)内连接 inner join:

hive (cfpd_ods_safe)> select * from ta inner join tb on ta.uid=tb.uid;
ta.uid  tb.uid
1111    1111
2222    2222
Time taken: 21.597 seconds, Fetched: 2 row(s)

         可见inner join和直接逗号连接效果是一样的。

(3)左连接left join:

hive (cfpd_ods_safe)> select * from ta left join tb on ta.uid=tb.uid;
ta.uid  tb.uid
1111    1111
2222    2222
3333    NULL
4444    NULL
Time taken: 22.921 seconds, Fetched: 4 row(s)

(5)左外连接 left outer join:

hive (cfpd_ods_safe)> select * from ta left outer join tb on ta.uid=tb.uid;
ta.uid  tb.uid
1111    1111
2222    2222
3333    NULL
4444    NULL
Time taken: 22.637 seconds, Fetched: 4 row(s)

(6)全连接 full join:

hive (cfpd_ods_safe)> select * from ta full join tb on ta.uid=tb.uid;
ta.uid  tb.uid
1111    1111
2222    2222
3333    NULL
4444    NULL
NULL    5555
Time taken: 19.39 seconds, Fetched: 5 row(s)

(7)全外连接 full outer join:

hive (cfpd_ods_safe)> select * from ta full outer join tb on ta.uid=tb.uid;
ta.uid  tb.uid
1111    1111
2222    2222
3333    NULL
4444    NULL
NULL    5555
Time taken: 20.414 seconds, Fetched: 5 row(s)

结论:

(1)inner join效果和逗号连接一样,逗号其实是inner join的简写。

(2)不带条件的所有连接都是笛卡尔积

(3)left join和left outer join是一样的,full join和full outer join是一样的。right一样。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • linux 命令英文全称

    su:Swith user  切换用户,切换到root用户 cat: Concatenate  串联 uname: Unix name  系统名称 df...

    幽鸿
  • Sqoop-1.4.4工具import和export使用详解

    Sqoop可以在HDFS/Hive和关系型数据库之间进行数据的导入导出,其中主要使用了import和export这两个工具。这两个工具非常强大,提供了很多选项帮...

    幽鸿
  • Spring MVC Controller层事物注解不生效

    最近在写一个管理台页面,是从页面提交多个form到controller层的,这些form要么都能提交成功,要么都失败。controller层需要进行事物处理,于...

    幽鸿
  • 搞来两端模拟自由落体与抛物运动的JS玩

    这里有更详细的讲解呵呵 http://www.cnblogs.com/cloudgamer/archive/2009/01/06/Tween.html 自由...

    练小习
  • Nginx学习笔记

    Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。

    yaohong
  • 基于OV5640的FPGA-DDR HDMI显示

    这部分主要是使用Vivado中MIG IP核的使用,网上有很多参考例程,这里就不过多描述了,主要说明及使用,详见文末附件。

    碎碎思
  • 从GEO数据库下载得到表达矩阵 一文就够

    在第一讲我们详细介绍了GEO数据库的基础知识及规律,也了解了如何利用官方R包GEOquery来探索GEO数据库,当然,我的生信菜鸟团博客里面也从很多其它角度解析...

    生信技能树
  • 155.Min Stack(Stack-Easy)

        Design a stack that supports push, pop, top, and retrieving the minimum elem...

    Jack_Cui
  • 科个普啦—机器学习(上)

    昨天聊了深度学习,它其实是机器学习的一种,而机器学习的目的是为了学会解决问题。 这里的机器实质上是一个计算机,所能解决的问题得是数学上的问题,因此生活中要解决的...

    linxinzhe
  • IC 圆桌派,DFT 第一场复盘

    近年来DFT 是个大热点,业内需求量暴增,但人才匮乏,以致千金难求一人。IC 圆桌派讨论了半日DFT, 有大神坐阵,干活太多,分两场复盘,第一场内容可概括为:

    老秃胖驴

扫码关注云+社区

领取腾讯云代金券