Hive SQL 分组与连接操作详解

2024-09-07 03:04

本文主要是介绍Hive SQL 分组与连接操作详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

分组

Group By语句

1. 案例实操

 Having语句

1. having 与 where 不同点

2. 案例实操

 Join语句

 等值Join

1. 案例实操

 表的别名

1. 好处

2. 案例实操

 内连接

 左外连接

 右外连接

 满外连接

 多表连接

1. 创建位置表

2. 导入数据

3. 多表连接查询

 笛卡尔集

1. 笛卡尔集会在下面条件下产生

2. 案例实操

 联合(union & union all)

1. union & union all 上下拼接

2. 案例实操


分组

Group By语句

Group By 语句通常会和聚合函数一起使用,按照一个或者多个列对结果进行分组,然后对每个组执行聚合操作。

1. 案例实操
  1. 计算 emp 表每个部门的平均工资

    SELECT t.deptno, AVG(t.sal) avg_sal 
    FROM emp t 
    GROUP BY t.deptno;
  2. 计算 emp 每个部门中每个岗位的最高薪水

    SELECT t.deptno, t.job, MAX(t.sal) max_sal 
    FROM emp t 
    GROUP BY t.deptno, t.job;

 Having语句

1. having 与 where 不同点
  1. where 后面不能写分组聚合函数,而 having 后面可以使用分组聚合函数。
  2. having 只用于 group by 分组统计语句。
2. 案例实操
  1. 求每个部门的平均薪水大于2000的部门

     

    ① 求每个部门的平均工资

    SELECT deptno, AVG(sal) 
    FROM emp 
    GROUP BY deptno;

    ② 求每个部门的平均薪水大于2000的部门

    SELECT deptno, AVG(sal) avg_sal 
    FROM emp 
    GROUP BY deptno 
    HAVING avg_sal > 2000;

 Join语句

 等值Join

Hive支持通常的SQL join 语句,但是只支持等值连接,不支持非等值连接。

1. 案例实操
  1. 根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门名称
    SELECT e.empno, e.ename, d.dname 
    FROM emp e 
    JOIN dept d 
    ON e.deptno = d.deptno;

 表的别名

1. 好处
  1. 使用别名可以简化查询。
  2. 区分字段的来源。
2. 案例实操

合并员工表和部门表。

SELECT e.*, d.* 
FROM emp e 
JOIN dept d 
ON e.deptno = d.deptno;

 内连接

内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。

SELECT e.empno, e.ename, d.deptno 
FROM emp e 
JOIN dept d 
ON e.deptno = d.deptno;

 左外连接

左外连接:join 操作符左边表中符合 where 子句的所有记录将会被返回。

SELECT e.empno, e.ename, d.deptno 
FROM emp e 
LEFT JOIN dept d 
ON e.deptno = d.deptno;

 右外连接

右外连接:join 操作符右边表中符合 where 子句的所有记录将会被返回。

SELECT e.empno, e.ename, d.deptno 
FROM emp e 
RIGHT JOIN dept d 
ON e.deptno = d.deptno;

 满外连接

满外连接:将会返回所有表中符合 where 语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用 null 值替代。

SELECT e.empno, e.ename, d.deptno 
FROM emp e 
FULL JOIN dept d 
ON e.deptno = d.deptno;

 多表连接

注意:连接 n 个表,至少需要 n-1 个连接条件。例如:连接三个表,至少需要两个连接条件。

1. 创建位置表
CREATE TABLE IF NOT EXISTS location (loc INT,      -- 部门位置idloc_name STRING  -- 部门位置
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
2. 导入数据
LOAD DATA LOCAL INPATH '/opt/module/hive/datas/location.txt' INTO TABLE location;
3. 多表连接查询
SELECT e.ename, d.dname, l.loc_name
FROM emp e 
JOIN dept d
ON d.deptno = e.deptno 
JOIN location l
ON d.loc = l.loc;

大多数情况下,Hive会对每对 join 连接对象启动一个 MapReduce 任务。本例中会首先启动一个 MapReduce job 对表 e 和表 d 进行连接操作,然后会再启动一个 MapReduce job 将第一个 MapReduce job 的输出和表 l 进行连接操作。

注意:为什么不是表 d 和表 l 先进行连接操作呢?这是因为 Hive 总是按照从左到右的顺序执行的。

 笛卡尔集

1. 笛卡尔集会在下面条件下产生
  1. 省略连接条件
  2. 连接条件无效
  3. 所有表中的所有行互相连接
2. 案例实操
SELECT empno, dname 
FROM emp, dept;

 联合(union & union all)

1. union & union all 上下拼接

unionunion all 都是上下拼接 SQL 的结果,这点是和 join 有区别的,join 是左右关联,unionunion all 是上下拼接。union 去重,union all 不去重。

unionunion all 在上下拼接 SQL 结果时有两个要求:

  1. 两个 SQL 的结果,列的个数必须相同
  2. 两个 SQL 的结果,上下所对应列的类型必须一致
2. 案例实操

将员工表 30 部门的员工信息和 40 部门的员工信息,利用 union 进行拼接显示。

SELECT *
FROM emp
WHERE deptno = 30
UNION
SELECT *
FROM emp
WHERE deptno = 40;

这篇关于Hive SQL 分组与连接操作详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143875

相关文章

MySQL 多表连接操作方法(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)

《MySQL多表连接操作方法(INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLOUTERJOIN)》多表连接是一种将两个或多个表中的数据组合在一起的SQL操作,通过连接,... 目录一、 什么是多表连接?二、 mysql 支持的连接类型三、 多表连接的语法四、实战示例 数据准备五、连接的性

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

SpringBoot3.4配置校验新特性的用法详解

《SpringBoot3.4配置校验新特性的用法详解》SpringBoot3.4对配置校验支持进行了全面升级,这篇文章为大家详细介绍了一下它们的具体使用,文中的示例代码讲解详细,感兴趣的小伙伴可以参考... 目录基本用法示例定义配置类配置 application.yml注入使用嵌套对象与集合元素深度校验开发

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多