Hive ---- 查询

news2025/1/12 19:48:18

Hive ---- 查询

  • 1. 基础语法
  • 2. 基本查询(Select…From)
    • 1. 数据准备
    • 2. 全表和特定列查询
    • 3. 列别名
    • 4. Limit语句
    • 5. Where语句
    • 6. 关系运算函数
    • 7. 逻辑运算函数
    • 8. 聚合函数
  • 3. 分组
    • 1. Group By语句
    • 2. Having语句
  • 4. Join语句
    • 1. 等值Join
    • 2. 表的别名
    • 3. 内连接
    • 4. 左外连接
    • 5. 右外连接
    • 6. 满外连接
    • 7. 多表连接
    • 8. 笛卡尔集
    • 9. 联合(union & union all)
  • 5. 排序
    • 1. 全局排序(Order By)
    • 2. 每个Reduce内部排序(Sort By)
    • 3. 分区(Distribute By)
    • 4. 分区排序(Cluster By)

1. 基础语法

1. 官网地址
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select

2. 查询语句语法:

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
  FROM table_reference       -- 从什么表查
  [WHERE where_condition]   -- 过滤
  [GROUP BY col_list]        -- 分组查询
   [HAVING col_list]          -- 分组后过滤
  [ORDER BY col_list]        -- 排序
  [CLUSTER BY col_list
    | [DISTRIBUTE BY col_list] [SORT BY col_list]
  ]
 [LIMIT number]                -- 限制输出的行数

2. 基本查询(Select…From)

1. 数据准备

(0)原始数据
在/opt/module/hive/datas/路径上创建dept.txt文件,并赋值如下内容:
部门编号 部门名称 部门位置id

[fickler@hadoop102 datas]$ vim dept.txt

写入以下内容

10	行政部	1700
20	财务部	1800
30	教学部	1900
40	销售部	1700

在/opt/module/hive/datas/路径上创建emp.txt文件,并赋值如下内容:
员工编号 姓名 岗位 薪资 部门

[fickler@hadoop102 datas]$ vim emp.txt

写入以下内容

7369	张三	研发	800.00	30
7499	李四	财务	1600.00	20
7521	王五	行政	1250.00	10
7566	赵六	销售	2975.00	40
7654	侯七	研发	1250.00	30
7698	马八	研发	2850.00	30
7782	金九	\N	2450.0	30
7788	银十	行政	3000.00	10
7839	小芳	销售	5000.00	40
7844	小明	销售	1500.00	40
7876	小李	行政	1100.00	10
7900	小元	讲师	950.00	30
7902	小海	行政	3000.00	10
7934	小红明	讲师	1300.00	30

(1)创建部门表

hive (default)>
create table if not exists dept(
    deptno int,    -- 部门编号
    dname string,  -- 部门名称
    loc int        -- 部门位置
)
row format delimited fields terminated by '\t';

(2)创建员工表

hive (default)>
create table if not exists emp(
    empno int,      -- 员工编号
    ename string,   -- 员工姓名
    job string,     -- 员工岗位(大数据工程师、前端工程师、java工程师)
    sal double,     -- 员工薪资
    deptno int      -- 部门编号
)
row format delimited fields terminated by '\t';

(3)导入数据

load data local inpath '/opt/module/hive/datas/dept.txt' into table dept;
load data local inpath '/opt/module/hive/datas/emp.txt' into table emp;

2. 全表和特定列查询

1. 全表查询

select * from emp;

在这里插入图片描述
2. 选择特定列查询

select empno, ename from emp;

在这里插入图片描述
注意:
(1)SQL 语言大小写不敏感。
(2)SQL 可以写在一行或者多行。
(3)关键字不能被缩写也不能分行。
(4)各子句一般要分行写。
(5)使用缩进提高语句的可读性。

3. 列别名

1)重命名一个列
2)便于计算
3)紧跟列名,也可以在列名和别名之间加入关键字‘AS’
4)案例实操
查询名称和部门。

select 
    ename AS name, 
    deptno dn 
from emp;

在这里插入图片描述

4. Limit语句

典型的查询会返回多行数据。limit子句用于限制返回的行数。

select * from emp limit 5;

在这里插入图片描述

select * from emp limit 2,3; -- 表示从第2行开始,向下抓取3行

在这里插入图片描述

5. Where语句

1)使用where子句,将不满足条件的行过滤掉
2)where子句紧随from子句
3)案例实操
查询出薪水大于1000的所有员工。

select * from emp where sal > 1000;

在这里插入图片描述
注意:where子句中不能使用字段别名。

6. 关系运算函数

1. 基本语法
如下操作符主要用于where和having语句中。
在这里插入图片描述

7. 逻辑运算函数

1. 基本语法(and/or/not)
在这里插入图片描述
2. 案例实操
(1)查询薪水大于1000,部门是30

select
    *
from emp
where sal > 1000 and deptno = 30;

在这里插入图片描述

(2)查询薪水大于1000,或者部门是30

select
    *
from emp
where sal > 1000 or deptno = 30;

在这里插入图片描述

(3)查询除了20部门和30部门以外的员工信息

select
    *
from emp
where deptno not in(30, 20);

在这里插入图片描述

8. 聚合函数

1. 语法
count(*),表示统计所有行数,包含null值;
count(某列),表示该列一共有多少行,不包含null值;
max(),求最大值,不包含null,除非所有值都是null;
min(),求最小值,不包含null,除非所有值都是null;
sum(),求和,不包含null。
avg(),求平均值,不包含null。

2. 案例实操
(1)求总行数(count)

select count(*) cnt from emp;

hive sql执行过程:
在这里插入图片描述
在这里插入图片描述
(2)求工资的最大值(max)

select max(sal) max_sal from emp;

hive sql执行过程:
在这里插入图片描述
在这里插入图片描述
(3)求工资的最小值(min)

select min(sal) min_sal from emp;

hive sql执行过程:
在这里插入图片描述
在这里插入图片描述

(4)求工资的总和(sum)

select sum(sal) sum_sal from emp; 

hive sql执行过程:
在这里插入图片描述
在这里插入图片描述

(5)求工资的平均值(avg)

select avg(sal) avg_sal from emp;

hive sql执行过程:
在这里插入图片描述
在这里插入图片描述

3. 分组

1. Group By语句

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

案例实操:
(1)计算emp表每个部门的平均工资。

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

hive sql执行过程:
在这里插入图片描述
在这里插入图片描述
(2)计算emp每个部门中每个岗位的最高薪水。

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

hive sql执行过程:
在这里插入图片描述
在这里插入图片描述

2. Having语句

1. having与where不同点
(1)where后面不能写分组聚合函数,而having后面可以使用分组聚合函数。
(2)having只用于group by分组统计语句。

2. 案例实操
(1)求每个部门的平均薪水大于2000的部门
求每个部门的平均工资。

select 
    deptno, 
    avg(sal) 
from emp 
group by deptno;

hive sql执行过程:
在这里插入图片描述
在这里插入图片描述
求每个部门的平均薪水大于2000的部门。

select
    deptno,
    avg(sal) avg_sal
from emp
group by deptno
having avg_sal > 2000;

hive sql执行过程:
在这里插入图片描述
在这里插入图片描述

4. Join语句

1. 等值Join

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

1. 案例实操
(1)根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门名称。

select 
    e.empno, 
    e.ename, 
    d.dname 
from emp e 
join dept d 
on e.deptno = d.deptno;

hive sql执行过程:
在这里插入图片描述
在这里插入图片描述

2. 表的别名

1. 好处
(1)使用别名可以简化查询。
(2)区分字段的来源。

2. 案例实操
合并员工表和部门表。

select 
    e.*,
    d.* 
from emp e 
join dept d 
on e.deptno = d.deptno;

在这里插入图片描述

3. 内连接

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

select
    e.empno,
    e.ename,
    d.deptno
from emp e
join dept d
on e.deptno = d.deptno;

在这里插入图片描述

4. 左外连接

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

select
    e.empno,
    e.ename,
    d.deptno
from emp e
left join dept d
on e.deptno = d.deptno;

5. 右外连接

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

select
    e.empno,
    e.ename,
    d.deptno
from emp e
left join dept d
on e.deptno = d.deptno;

6. 满外连接

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

select 
    e.empno, 
    e.ename, 
    d.deptno 
from emp e 
full join dept d 
on e.deptno = d.deptno;

7. 多表连接

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

数据准备,在/opt/module/hive/datas/下:vim location.txt

[fickler@hadoop102 datas]$ vim location.txt

部门位置id 部门位置

1700	北京
1800	上海
1900	深圳

1. 创建位置表

create table if not exists location(
    loc int,           -- 部门位置id
    loc_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总是按照从左到右的顺序执行的。

8. 笛卡尔集

1. 笛卡尔集会在下面条件下产生
(1)省略连接条件
(2)连接条件无效
(3)所有表中的所有行互相连接

2. 案例实操

select 
    empno, 
    dname 
from emp, dept;

hive sql执行过程:
在这里插入图片描述
在这里插入图片描述

9. 联合(union & union all)

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

union和union all在上下拼接sql结果时有两个要求:
(1)两个sql的结果,列的个数必须相同
(2)两个sql的结果,上下所对应列的类型必须一致

2. 案例实操
将员工表30部门的员工信息和40部门的员工信息,利用union进行拼接显示。

select 
    *
from emp
where deptno=30
union
select 
    *
from emp
where deptno=40;

在这里插入图片描述

5. 排序

1. 全局排序(Order By)

Order By:全局排序,只有一个Reduce。

1. 使用Order By子句排序
asc(ascend):升序(默认)
desc(descend):降序

2. Order By子句在select语句的结尾

3. 基础案例实操
(1)查询员工信息按工资升序排列

select
    *
from emp
order by sal;

hive sql执行过程:
在这里插入图片描述
在这里插入图片描述

(2)查询员工信息按工资降序排列

select 
    * 
from emp 
order by sal desc;

在这里插入图片描述

4. 按照别名排序案例实操
按照员工薪水的2倍排序。

select
    ename,
    sal * 2 twosal
from emp
order by twosal;

hive sql执行过程:
在这里插入图片描述

在这里插入图片描述

5. 多个列排序案例实操
按照部门和工资升序排序。

select
    ename,
    deptno,
    sal
from emp
order by deptno, sal;

hive sql执行过程:
在这里插入图片描述
在这里插入图片描述

2. 每个Reduce内部排序(Sort By)

Sort By:对于大规模的数据集order by的效率非常低。在很多情况下,并不需要全局排序,此时可以使用Sort by。
Sort by为每个reduce产生一个排序文件。每个Reduce内部进行排序,对全局结果集来说不是排序。

1. 设置reduce个数

set mapreduce.job.reduces=3;

2. 查看设置reduce个数

set mapreduce.job.reduces;

在这里插入图片描述

3. 根据部门编号降序查看员工信息

select
    *
from emp
sort by deptno desc;

hive sql执行过程:
在这里插入图片描述
在这里插入图片描述

4. 将查询结果导入到文件中(按照部门编号降序排序)

insert overwrite local directory '/opt/module/hive/datas/sortby-result'
 select * from emp sort by deptno desc;

在这里插入图片描述
在这里插入图片描述

3. 分区(Distribute By)

Distribute By:在有些情况下,我们需要控制某个特定行应该到哪个Reducer,通常是为了进行后续的聚集操作。distribute by子句可以做这件事。distribute by类似MapReduce中partition(自定义分区),进行分区,结合sort by使用。

对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute by的效果。

1. 案例实操:
(1)先按照部门编号分区,再按照员工编号薪资排序

set mapreduce.job.reduces=3;

insert overwrite local directory
'/opt/module/hive/datas/distribute-result'
select
    *
from emp
distribute by deptno
sort by sal desc;

注意:

  • distribute by的分区规则是根据分区字段的hash码与reduce的个数进行相除后,余数相同的分到一个区。
  • Hive要求distribute by语句要写在sort by语句之前。
  • 演示完以后mapreduce.job.reduces的值要设置回-1,否则下面分区or分桶表load跑MapReduce的时候会报错。

hive sql执行过程:
在这里插入图片描述
在这里插入图片描述

如果按部门编号进行分区的话,应该是分成 4 个区,但是 reduce 只设置了 3 个,所以 40 和 10 被分到了一个区中

4. 分区排序(Cluster By)

当distribute by和sort by字段相同时,可以使用cluster by方式。
cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为asc或者desc。

(1)以下两种写法等价

hive (default)> 
select 
    * 1
from emp 
cluster by deptno;

hive (default)> 
select 
    * 
from emp 
distribute by deptno 
sort by deptno;

注意:按照部门编号分区,不一定就是固定死的数值,可以是20号和30号部门分到一个分区里面去。

hive sql执行过程:
在这里插入图片描述

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

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

相关文章

vue:el-table初始化表格选中项踩坑记录/element-ui表格

问题描述 首先,element-ui表格多选功能可以参考官网示例:表格数据多选;手动在表格中选取数据、通过监听selection-change获取选中项,实现起来非常顺利~ 但在保存了选项、重新加载表格时,希望将已选项“打勾”却完全没…

这篇文章告诉你excel批量翻译有什么方法

在商业或个人领域中,我们有时需要将大量文本翻译成不同语言,例如跨国企业需要在不同的国家和地区之间进行文件传输和协作,在旅行时我们需要阅读当地语言的信息或地图。如果我们手动操作的话,是非常耗时且容易出错的,所…

知识管理、文档管理两手抓,全靠它!

知识管理和文档管理是两个相互关联的概念,两者之间的关系非常密切。知识管理是指对组织内外的知识资源进行收集、整理、存储、共享和应用的过程,旨在提高组织的绩效和创新能力。而文档管理是指对组织内外的文档资源进行收集、整理、存储、共享和应用的过…

chatgpt赋能Python-python_heading__

Python heading()方法:提高网页的SEO效果 介绍 在网页开发过程中,SEO(搜索引擎优化)是一个重要的考虑因素。网页的排名和可见性对于用户的访问和广告收益非常重要。好的SEO可以大大提高网页的可见性和流量。因此,网页…

SolVES模型生态系统服务功能社会价值评估

查看原文>>>SolVES 模型生态系统服务功能社会价值评估(基于多源环境QGIS、PostgreSQL、ArcGIS、Maxent、R语言) 目录 第一章、理论基础与研究热点 第二章、SolVES 4.0 模型运行环境配置 第三章、SolVES 4.0 模型运行 第四章、数据获取与入…

【追梦之旅】— 堆的实际应用--TopK问题

【追梦之旅】— 堆的实际应用--TopK问题😎 前言🙌堆的TopK问题的现实栗子堆的TopK思路的应用场景堆的TopK思路的具体实现fscanf函数fprintf函数堆的TopK具体实现代码:前K个数据的巧妙设置运行结果截图: 总结撒花💞 &am…

chatgpt赋能Python-python_ip地址判断

Python IP地址判断 - 从入门到精通 如果您是一个开发人员并且经常需要处理网络相关的任务,那么您一定知道 IP 地址是什么。 IP 地址(Internet Protocol Address),是网络中用于标识设备的唯一标识符。 在本篇文章中,您…

chatgpt赋能Python-python_iloc

Python iLoc的使用方法及其在数据处理中的应用 Python是一种灵活的编程语言,可以在数据科学领域中广泛应用。在数据处理中,许多人都熟悉Pandas数据框架。本篇文章将介绍Pandas中的iloc方法,以及如何在数据处理中使用它。 iloc方法是什么? …

基于html+css的图展示87

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

CryoEM - 冷冻电镜 CryoSPARC 单颗粒图像数据集构建

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130822537 CryoSPARC 的 downsample 操作是一种用于减少数据集大小的技术,可以提高计算效率和内存使用率。downsample 操作的原理是将原始图像的分辨率降低…

SpringBoot是如何简化配置的

Spring Boot 如何简化配置? Spring Boot 是一个基于 Spring 框架的快速开发框架,它可以大大简化应用程序的配置过程。本文将介绍 Spring Boot 是如何简化配置的,并提供相关的代码示例。 一、自动化配置 Spring Boot 的自动化配置功能可以根…

C++【实现AVL树】

文章目录 一、AVL树的概念及性能二、AVL树结点的创建三、AVL树的插入四、四种旋转(1)LL-左单旋(2)RR-右单旋(3)LR-左右旋(4)RL-右左旋 五、判断AVL树六、测试结果七、源代码(1) AVL_…

低代码开发平台魔笔 X 浙江广电集团:“10天”成为行业最小创新单位!

客户背景概述 浙江广播电视集团(以下简称浙江台)是一家以广播电视为主业,兼营相关产业的综合媒体集团,是国内最具影响力的省级媒体之一。因新业务拓展需要,浙江台也需随之上线一套全新的媒资平台系统进行运营支撑,而新…

2023年湖北助理工程师个人申报怎么申请?

这是许多出入职场的人,比较关心的话题,想要申请一个助理工程师怎么办呢?助理职称好不好办?助理工程师职称个人怎么申请呢?助理工程师申需要什么材料呢?助理工程师申报有什么流程呢?甘建二现在教…

五、数据仓库详细介绍(建模)实践篇

1 数仓建模在数仓建设过程中的位置 这张截图源自之前从 0 到 1 建设数据仓库的经验总结,采用的是瀑布模式的展现方式,但实际操作中经常会使用螺旋迭代模式,因为很难有人能够一步到位的考虑清楚所有细节。 通过业务调研我们熟悉了相关业务过程…

手把手教你用Python编写邮箱脚本引擎

版权声明:原创不易,本文禁止抄袭、转载需附上链接,侵权必究! 目录 一、邮箱知识点简介二、常见邮箱开启SMTP服务2.1 QQ邮箱​2.2 163邮箱2.3 阿里云邮箱(企业版)2.4 Gmail邮箱 三、Python编写邮箱引擎3.1 编…

Deferred Components-实现Flutter运行时动态下发Dart代码 | 京东云技术团队

导读 Deferred Components,官方实现的Flutter代码动态下发的方案。本文主要介绍官方方案的实现细节,探索在国内环境下使用Deferred Components,并且实现了最小验证demo。读罢本文,你就可以实现Dart文件级别代码的动态下发。 一、…

蓝精灵协会启动第二阶段的 NFT 连续发售活动

四个月前,蓝精灵协会推出了一款完全上链的 NFT 游戏,参与的钱包数量超过 85,000 个,并进入了前 100 Dapps 排名,成为了 Web3 领域的一匹黑马。 两周前,我们开始了第二阶段的连续销售活动,旨在建立一个前沿 …

privateGPT centos7环境下部署和研究

gihtub代码 https://github.com/imartinez/privateGPT 安装 llama-cpp-python-0.1.48安装报错 Could not build wheels for llama-cpp-python, , which is required to install pyproject.toml-based projects搜索(结果较少): 从文章&#…

python数据分析与可视化学习简记(更新中)

numpy简介 numpy(Numerical Python)是python语言的扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供了大量的数学函数库 作用 Numpy是一个运行速度非常快的数学库,主要用于数组计算 安装 可以使用如下命令在命令行安装即可 p…