当前位置: 首页 > article >正文

Hive查询之分组与Join

Hive查询之分组与Join


文章目录

  • Hive查询之分组与Join
    • 写在前面
    • 分组
      • Group By语句
      • Having语句
    • Join语句
      • 等值Join
      • 表的别名
        • 好处
        • 案例实操
      • 内连接
      • 左外连接
      • 右外连接
      • 满外连接
      • 多表连接
      • 笛卡尔积


写在前面

  • Linux版本:CentOS7.5
  • Hive版本:Hive-3.1.2

分组

Group By语句

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

案例实操:

(1)计算emp表每个部门的平均工资

hive (default)> select t.deptno, avg(t.sal) avg_sal from emp t group by t.deptno;

(2)计算emp每个部门中每个岗位的最高薪水

hive (default)> select t.deptno, t.job, max(t.sal) max_sal from emp t group by t.deptno, t.job;

Having语句

having与where不同点

  • where后面不能写分组函数,而having后面可以使用分组函数。
  • having只用于group by分组统计语句。

案例实操

(1)求每个部门的平均薪水大于2000的部门

  • 求每个部门的平均工资
hive (default)> select deptno, avg(sal) from emp group by deptno;
  • 求每个部门的平均薪水大于2000的部门
hive (default)> select deptno, avg(sal) avg_sal from emp group by deptno having avg_sal > 2000;

Join语句

等值Join

Hive支持通常的SQL JOIN语句。

  • 案例实操

根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门名称;

hive (default)> select e.empno, e.ename, d.deptno, d.dname from emp e join dept d on e.deptno = d.deptno;

表的别名

好处
  • 使用别名可以简化查询。
  • 使用表名前缀可以提高执行效率。
案例实操

合并员工表和部门表

hive (default)> select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno;

内连接

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

hive (default)> select e.empno, e.ename, d.deptno from emp e join dept d on e.deptno = d.deptno;

左外连接

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

hive (default)> select e.empno, e.ename, d.deptno from emp e left join dept d on e.deptno = d.deptno;

右外连接

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

hive (default)> select e.empno, e.ename, d.deptno from emp e right join dept d on e.deptno = d.deptno;

满外连接

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

hive (default)> select e.empno, e.ename, d.deptno from emp e full join dept d on e.deptno = d.deptno;

多表连接

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

  • 数据准备
1700	Beijing
1800	London
1900	Tokyo
  • 创建位置表
create table if not exists location(
loc int,
loc_name string
) 
row format delimited fields terminated by '\t';
  • 导入数据
hive (default)> load data local inpath '/opt/module/datas/location.txt' into table location;
  • 多表连接查询
hive (default)>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总是按照从左到右的顺序执行的。

优化:当对3个或者更多表进行join连接时,如果每个on子句都使用相同的连接键的话,那么只会产生一个MapReduce job。

笛卡尔积

笛卡尔积会在下面条件下产生

  • 省略连接条件
  • 连接条件无效
  • 所有表中的所有行互相连接

案例实操

hive (default)> select empno, dname from emp, dept;

全文结束!!!


http://www.kler.cn/a/549339.html

相关文章:

  • 链表 —— 常用技巧与操作总结详解
  • [思考记录.AI]关于Deepseek-r1的思维链
  • DeepSeek 助力 Vue 开发:打造丝滑的评分组件(Rating)
  • 什么是MVC?什么是SpringMVC?什么是三层架构?
  • Cursor 配置管理器:优化您的编辑器体验
  • Kotlin 2.1.0 入门教程(二十)扩展
  • 青少年编程与数学 02-009 Django 5 Web 编程 17课题、中间件
  • 车载音频架构图详解(精简)
  • 【Scrapy】Scrapy教程2——工作原理
  • 《全球网络安全政策法律发展研究报告 (2024) 》
  • pycharm社区版有个window和arm64版本,到底下载哪一个?还有pycharm官网
  • PHP本地商家卡券管理系统
  • C# 控制台相关 API 与随机数API
  • JavaWeb——Servlet基础
  • LeetCode每日精进:142.环形链表II
  • Dify+Ollama本地部署deepseek模型(自用)
  • Express 中 res 响应方法详解
  • kubectl top输出与Linux free命令不一致原因?
  • BGP配置华为——RR反射器配置
  • HCIA项目实践---ACL访问控制列表相关知识和配置过程