Hive----join语句

简介: join语句

[inner] join

内连接


left [outer] join

左外连接


right [outer] join

右外连接


full [outer] join

全连接


left semi join

左半连接


cross join

笛卡尔积



A表和B表,共有字段idname,交叉部分(黄色)表示id相同:

image.png


  • 查询各颜色部分数据:
  1. 红:select       * from A left join B on A.id=B.id where B.id is null ;
  2. 绿:select * from A right       join B on A.id=B.id where       A.id is null ;
  3. 黄:select * from A join B on A.id=B.id ;
  4. 红+黄:select * from A left       join B on A.id=B.id ;
  5. 绿+黄:select * from A rigth       join B on A.id=B.id ; 【or】select * from B left       join A on A.id=B.id ;
  6. 红+绿:select * from A full       outer join B on A.id=B.id where A.id       is null or      B.id is null ;
  7. 红+黄+绿:select * from A full       outer join B on A.id=B.id ;

image.png

  • left semi       join
  • select  A.id,A.value from A  B on A.id=B.id ;
  • <==>
  • select  A.id,A.value from A where  A.id in (select B.id from B);
  •  
  •  
  •  
  • cross join
  • CROSS  JOIN是sql中的一种连接方式,区别于内连接和外连接,对于cross join连接来说,其实使用的就是笛卡尔连接。在SQL中,当CROSS  JOIN不使用WHERE子句时,CROSS JOIN产生了一个结果集,该结果集是两个关联表的行的乘积。通常,如果每个表分别具有n和m行,则结果集将具有n*m行;

----------------------------------------------------------------------------------------------------------


  • image.png 谈谈如何对join操作进行优化?
  • join优化是个复杂的问题,可以从以下几点进行优化:
  • 1)小表前置
  • 大小表在join的时候,应该将小表放在前面,Hive在解析带join的SQL语句时,会默认将最后一个表作为大表,将前面的表作为小表并试图将它们读进内存。如果表顺序写反,大表在前面,可能会引发OOM。
  • 2)key值相同
  • 多表join的时候尽量使用相同的key来关联,这样会将会将多个join合并为一个MR job来处理。
  • 3)利用map join特性
  • map  join特别适合大小表join的情况。Hive会将大表和小表在map端直接完成join过程,消灭reduce,效率很高。Hive 0.8版本之前,需要加上map  join的暗示,以显式启用map join特性,具体做法是在select语句后面增加/*+mapjoin(需要广播的较小表)*/。
  • map  join的配置项是hive.auto.convert.join,默认值true;还可以控制map join启用的条件,hive.mapjoin.smalltable.filesize,当较小表大小小于该值就会启用map join,默认值25MB。

两表join要考虑两个问题:

  1. 根据所需求的数据范围选择用什么join(主要是join、left join、full outer join)
  2. 根据两表的粒度判断:如果是大粒度join小粒度而取大粒度,要防止出现数据扩容,需要对大表聚合去重;剩下的情况可不用考虑

案例:

本案例中使用了 union all (查询合并)、distinct(去重)、cross join(笛卡尔积)

 

SELECT

b.class,a.blood,COUNT(s.id) AS num

FROM

(SELECT 'A'  AS blood UNION ALL

SELECT 'B' UNION ALL

SELECT 'C' UNION ALL

SELECT 'D' )a

CROSS JOIN

(SELECT  DISTINCTclass  from stud) b

LEFT JOIN stud s

ON a.blood=s.blood AND s.class=b.class

GROUP BY b.class,a.blood

order by b.class,a.blood;

目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
JOIN顺序优化:小表驱动大表的执行原则
在数据库查询优化中,“小表驱动大表”是一种提升SQL查询效率的常用策略。其核心思想是优先处理数据量较小的表,再与大表进行连接操作,从而减少数据扫描量、降低I/O开销并提高内存使用效率。通过显式指定JOIN顺序、使用EXISTS替代IN以及合理创建索引等方式,可以有效实现该原则。例如,在连接部门表(小表)和员工表(大表)时,先处理小表可显著提升查询性能。掌握这一原则有助于编写高效SQL语句,优化数据库整体表现。
|
监控 Java
jvm性能调优实战 - 24模拟因动态年龄判断对象进入老年代的场景
jvm性能调优实战 - 24模拟因动态年龄判断对象进入老年代的场景
288 0
|
分布式计算 Hadoop Java
CDH性能优化(参数配置)
NameNode中用于处理RPC调用的线程数,即指定NameNode 的服务器线程的数量。NameNode有一个工作线程池用来处理客户端的远程过程调用及集群守护进程的调用,处理程序数量越多意味着要更大的池来处理来自不同DataNode的并发心跳以及客户端并发的元数据操作)。
552 0
|
10月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
583 113
|
JavaScript
element-ui表格数据样式及格式化案例
element-ui表格数据样式及格式化案例
625 0
|
SQL 存储 分布式计算
Flink 流批一体在 Shopee 的大规模实践
Shopee 研发专家李明昆在 Flink Forward Asia 2022 流批一体专场的分享。
10440 0
Flink 流批一体在 Shopee 的大规模实践
|
机器学习/深度学习 人工智能 自然语言处理
深入理解TF-IDF、BM25算法与BM25变种:揭秘信息检索的核心原理与应用
深入理解TF-IDF、BM25算法与BM25变种:揭秘信息检索的核心原理与应用

热门文章

最新文章