Hive查询Join

Select a.val,b.val From a [Left|Right|Full Outer] Join b On (a.key==b.key);

现有两张表:sales 列出了人名及其所购商品的 ID;things 列出商品的 ID 和名称:

hive> select * from sales;
OK
Joe     2
Hank    4
Ali     0
Eve     3
Hank    2
Time taken: 0.085 seconds, Fetched: 5 row(s)
hive> select * from things;
OK
2       Tie
4       Coat
3       Hat
1       Scarf
Time taken: 0.069 seconds, Fetched: 4 row(s)

1.内连接

Hive只支持等值连接,这意味着在 ON 关键字后的表达式中只能使用等号具体JAVA-API实现详见:MR案例:内连接

hive> select sales.*,things.*> from sales JOIN things ON(sales.id = things.id);
Joe     2       2       Tie
Hank    4       4       Coat
Eve     3       3       Hat
Hank    2       2       Tie

此外还可以在Where子句中指定连接条件。 

hive> select sales.*,things.*                  > from sales,things> where sales.id = things.id;
OK
Joe     2       2       Tie
Hank    4       4       Coat
Eve     3       3       Hat
Hank    2       2       Tie

单个的连接用一个 MR 作业实现。但是,如果多个连接的连接条件中使用了相同的列,那么平均每个连接可以至少用一个 MR 作业来实现。可以在查询前使用 Explain关键字 来查看 Hive将为某个查询使用多少个 MR 作业:【此部分在以后详述

hive> explain> select sales.*,things.*> from sales join things on (sales.id=things.id);

2.外连接

外连接可以让你找到连接表中不能匹配的数据行。前面的内连接,【Ali】那一行没有出现在输出中。因为她所购买商品的ID没有在things表中出现。具体JAVA-API实现详见MR案例:外连接

  左外连接:就可以显示左边表的所有数据行:T_Name1 LEFT OUTER JOIN T_Name2 ON ()

hive> select sales.*,things.*                             > from sales LEFT OUTER JOIN things ON(sales.id = things.id);
OK
Joe     2       2       Tie
Hank    4       4       Coat
Ali     0       NULL    NULL
Eve     3       3       Hat
Hank    2       2       Tie
Time taken: 13.387 seconds, Fetched: 5 row(s)

  右外连接T_Name1 RIGHT OUTER JOIN T_Name2 ON ()

hive> select sales.*,things.*                                    > from sales RIGHT OUTER JOIN things ON(sales.id = things.id);
OK
Joe     2       2       Tie
Hank    2       2       Tie
Hank    4       4       Coat
Eve     3       3       Hat
NULL    NULL    1       Scarf
Time taken: 14.54 seconds, Fetched: 5 row(s)

  全外连接T_Name1 FULL OUTER JOIN T_Name2 ON ()

hive> select sales.*,things.*                                     > from sales FULL OUTER JOIN things ON(sales.id = things.id); 
OK
Ali     0       NULL    NULL
NULL    NULL    1       Scarf
Hank    2       2       Tie
Joe     2       2       Tie
Eve     3       3       Hat
Hank    4       4       Coat
Time taken: 44.671 seconds, Fetched: 6 row(s)

  半连接T_Name1 LEFT SEMI JOIN T_Name2 ON () 

hive> select * from things> where things.id in   > (select id from sales);
OK
2       Tie
4       Coat
3       Hat
Time taken: 15.633 seconds, Fetched: 3 row(s)

  In查询可以转化为 半连接查询。必须遵循一个限制:右表(sales)只能在ON子句中出现。

hive> select * from things > LEFT SEMI JOIN sales ON(sales.id=things.id);
OK
2       Tie
4       Coat
3       Hat
Time taken: 13.169 seconds, Fetched: 3 row(s)

3.Map-side Join 具体JAVA-API实现详见MR案例:Map-Join

  • Join操作在 map 阶段完成,因此无需 reduce 阶段
  • 适合 一个大表,一个小表 的 Join 操作
  • 思想:小表复制到各个节点上,并加载到内存中;而对大表进行分片,每个分片与小表完成 Join 操作
select /*+ mapjoin(things) */ sales.*,things.*
from sales join things on sales.id=things.id;//等同于
select sales.*,things.*
from sales join things on sales.id=things.id;
  • hive 0.6 的时候默认认为写在select 后面的是大表,前面的是小表,或者使用 /*+mapjoin(map_table) */ 手工进行设定。
  • hive 0.7 以后这个计算是自动完成,设置 hive.auto.convert.join=true ,hive会自动判断哪个是小表,哪个是大表。判断小表的依据是hive.smalltable.filesize=25000000L(默认是25M),当小表超过这个大小,hive会自动转化成common join,即reduce-join。 

4.Reduce-side Join 具体JAVA-API实现详见MR案例:Reduce-Join

  • Join操作在reduce task中完成 【默认的join方式
  • 适合两个大表连接操作
  • 思想:map端按照连接字段进行hash,reduce 端完成连接操作

5.用于多于2个表的Join(有区别)

SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1);

如果 Join 的 key 相同,不管有多少个表,都会则会合并为一个 Map-Reduce

SELECT a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1)JOIN c ON (c.key = b.key2);

如果 Join 的条件不相同,Map-Reduce 的任务数目和 Join 操作的次数是相对应.(本例2次)

6.Join每次MR任务的逻辑

reducer 会缓存 join 序列中除了最后一个表的所有表的记录, 再通过最后一个表将结果序列化到文件系统。 这一实现有助于在 reduce 端减少内存的使用量。实践中,应该把最大的那个表写在最后(否则会因为缓存浪费大量内存)。例如:

 SELECT a.val, b.val, c.val FROM aJOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1);

使用 1 次MR任务,reduce 端会缓存 a 表和 b 表的记录,然后每次取得一个 c 表的记录就计算一次 join 结果。

  SELECT a.val, b.val, c.val FROM aJOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2);

使用 2 次MR任务,第一次缓存 a 表,用 b 表序列化;第二次缓存第一次 map/reduce 任务的结果,然后用 c 表序列化。

 

转载于:https://www.cnblogs.com/skyl/p/4737347.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jquery 获取easyui combobox选中的值

$(#comboboxlist).combobox(getValue);转载于:https://www.cnblogs.com/ftm-datablogs/p/5526857.html

调度Java应用程序中的主体

许多项目需要计划功能,例如我们计划的工作,重复的工作,异步执行等。 我们的首选方法是使用企业工作调度程序,例如OpenSymphony的Quartz。 使用计划任务进行编码时,最棘手的部分之一是执行部分。 这里的主要经验法则是…

继承映射关系 joinedsubclass的查询

会出现下面这样的错一般是配置文件中的mapping和映射文件中的package路径或者class中的name路径不一致 org.hibernate.MappingException: Unknown entity: com.zh.hibernate.joinedsubclass.Student at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(Sessi…

Spark系列—02 Spark程序牛刀小试

一、执行第一个Spark程序 1、执行程序 我们执行一下Spark自带的一个例子,利用蒙特卡罗算法求PI: 启动Spark集群后,可以在集群的任何一台机器上执行一下命令: /home/spark/spark-1.6.1-bin-hadoop2.6/bin/spark-submit \ --class o…

JVM选项:-client vs -server

您是否曾经在运行Java应用程序时想知道-client或-server开关是什么? 例如: javaw.exe -client com.blogspot.sdoulger.LoopTest也显示在java.exe的“帮助”中,例如,其中的选项包括: -client选择“客户端” VM -serv…

网页前台小知识

1.左右布局div块自适应,首先外边套一个div,把宽度固定一个px,然后margin设为0 atuo;这样他会根据窗口大小自动变换左右距离.就这么简单</p> 2.多个标签共用一个样式,用,分隔开 p…

统计字符串每个字符出现的次数

//str是个只包含小写字母的字符串&#xff0c;以下是统计每个字符出现的频数 int[] cnt new int[26];//toCharArray() for (char ch : str.toCharArray()) {cnt[ch - a]; }//charAt() for(int i 0;i<str.length;i){char ch str.charAt(i);cnt[ch - a]; }

在Java 7中处理文件

以下是The Well-Grounded Java Developer的草稿的修改后的片段。 它使您快速了解与以前版本相比&#xff0c;在Java 7中操作文件要容易得多。 通过使用新的Files类及其许多实用程序方法&#xff0c;您可以仅用一行代码就可以对文件执行以下操作&#xff1a; 创建 删除 复制 …

3.1存储管理操作系统

存储器管理的对象是主存&#xff08;内存&#xff09;。其主要功能包含分配和回收主存空间、提高主存的利用率、扩充主存、对主存信息实现有效保护。存储器的结构为&#xff1a;寄存去、缓存、主存、外存。逻辑地址&#xff08;对用户角度。程序存放的位置&#xff09;、物理地…

学习教材《构建之法》遇到的问题及思路

在学习中每个人都会遇到各种各样的问题&#xff0c;下面就是我遇到的问题及可能解决问题的思路。 1.如何写好程序的注释&#xff0c;每个人都会写注释&#xff0c;但是&#xff0c;需要注释什么&#xff1f; 思路&#xff1a;注释是为了解释程序做什么&#xff0c;为什么要这样…

了解和扩展Java ClassLoader

Java ClassLoader是项目开发中Java的关键但很少使用的组件之一。 就我个人而言&#xff0c;我从未在任何项目中扩展ClassLoader&#xff0c;但是拥有自己的可以自定义Java类加载的ClassLoader的想法让我感到很兴奋。 本文将概述Java类加载&#xff0c;然后继续创建自定义ClassL…

CAD教程-AL对其命令

AL可以实现不规则的对其功能 1.第一步按下AL&#xff0c;按下Enter 2.选择第一个源点 3.选择第一个目标点 4.选择第二个源点 5.选择第二个目标点 6.按下Enter&#xff0c;完成移位 转载于:https://www.cnblogs.com/weloveshare/p/4739873.html

使用Spring将POJO公开为JMX MBean

这是一个非常不错的教程&#xff0c;介绍了如何通过我们最新的JCG合作伙伴 “ The Holy Java ”博客&#xff08;很酷的名字&#xff09;实现“ 用Spring轻松将POJO作为JMX MBean公开 ”。 &#xff08;注意&#xff1a;对原始帖子进行了少量编辑以提高可读性&#xff09; Jav…

mysql 5.1由于Host为localhost的用户为空,密码为空,导致本地用户无法登陆。

不说了。直接上mysql的用户数据&#xff0c;第四列里面&#xff0c;host为localhost&#xff0c;用户为空&#xff0c;密码为空。 导致在本地登陆的时候除了root的账户外&#xff0c;其他账号不需要密码即可登陆&#xff0c;并且影响host为 %的用户登陆。 这里只需要删除对应的…

scala 88 for替换map,flatmap,filtermap,for,scala,flatmap

王家林亲授《DT大数据梦工厂》大数据实战视频“Scala深入浅出实战经典”视频、音频和PPT下载&#xff01;第88讲&#xff1a;Scala中使用For表达式实现map、flatMap、filter百度云盘&#xff1a;http://pan.baidu.com/s/1mgtgcIG360云盘&#xff1a;http://yunpan.cn/cdXsbctXf…

简单阐述下OC中UIImage三种创建方式~~~

一. 直接使用imageNamed进行创建 1 UIImage * image [UIImage imageNamed:"1.jpg"]; 简单说一下这种方式的优缺点&#xff1a; 优点&#xff1a;代码量少&#xff0c;一行代码就可以搞定。当程序中多次加载这张图片时&#xff0c;系统会指向同一块内存&#xff0c;…

(一二四)tableView的多组数据展示和手动排序

最近在写一个轻量级的网络游戏&#xff0c;遇到了技能优先顺序手动排序的需求&#xff0c;我就想到了iOS自带的tableView编辑功能&#xff0c;对其进行了初步探索&#xff0c;最后做出的效果如下图所示&#xff1a; 点击左边可以删除&#xff0c;拖住右边可以手动排序&#xff…

ARC_xp_20160530

1、 申请内存的地方在哪里&#xff1f;忘了...(应该是用的 malloc) 2、 键盘上按下一个键&#xff0c;处理的函数为&#xff1a;(所在的模块 应该是“CEGUIIrrlichtRenderer.dll”) 003B465F CC INT3 003B4660 /$ 53 PUSH EBX 003B4661 |. 56 …

Hibernate映射集合性能问题

首先&#xff0c;这篇文章的灵感来自于Burt Beckwith在2011年1月27日于SpringOne 2GX上发表的有关高级GORM –性能&#xff0c;定制和监控的演讲 。 简而言之&#xff0c; Burt Beckwith讨论了使用映射集合和GORM中的Hibernate 2级缓存的潜在性能问题&#xff0c;以及避免此类性…

算法:1!+(1!+3!)+(1!+3!+5!) + ( 1! + 3! + 5! + 7! + 9!)+....+(1!+3!+5!+ ... + m!)...

-(void)touchesBegan:(nonnull NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event{ //算法入口 [self func2:9]; } //计算阶乘 factor&#xff08;m&#xff09;&#xff1d; m&#xff01; -(int)factor:(int)m{ int factorNum0; if(m0|m1) return 1; e…