Hive【Hive(三)查询语句】

前言

        今天是中秋节,早上七点就醒了,干啥呢,大一开学后空教室紧缺,还不趁着假期来学校等啥呢。顺便偷偷许个愿吧,希望在明年的这个时候,秋招不知道赶不赶得上,我希望拿几个国奖,蓝桥杯、中国大学生计算机设计大赛、挑战杯、软件杯... 。最大的愿望还是能够早点找到一份心仪的工作!!!不说了,开卷!

Hive 查询语句

        查询语句必然是 Hive 的重中之重,之前的 SQL 基础也不是那么牢固,尤其是高级的 SQL 语句,这里需要恶补一下。

1、基本语法

每个关键字的顺序不能颠倒。

SELECT [ALL | DISTINCT] 字段1, 字段2, ...FROM 表名[WHERE 条件][GROUP BY 字段]    --分组查询[HAVING 字段]     --分组后过滤(group by 后只能用 having 不能再用 where)[ORDER BY 字段]    --排序[CLUSTER BY col_list| [DISTRIBUTE BY col_list] [SORT BY col_list]][LIMIT 页数]    --分页显示

2、基本查询

2.1、数据准备(Select…From)

创建文件 dept.txt、emp.txt、loc.txt。

dept.txt:

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

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

loc.txt:

1700	北京
1800	上海
1900	深圳
创建表

dept:

use default;
-- 创建部门表 在hdfs生成目录: /user/hive/warehouse/dept
create table if not exists dept(deptno int, --部门编号dname string,   --部门名称loc int --部门位置
)
row format delimited fields terminated by '\t';

emp:

-- 创建员工表 在hdfs生成目录: /user/hive/warehouse/emp
create table if not exists emp(empno int,  --员工编号ename string,   --员工姓名job string, --员工岗位sal double, --员工工资deptno int  --部门编号
)
row format delimited fields terminated by '\t';

location:

create table location(loc int,loc_name string
)
row format delimited fields terminated by '\t';
导入数据
load data local inpath '/opt/module/hive-3.1.2/datas/dept.txt' into table dept;load data local inpath '/opt/module/hive-3.1.2/datas/emp.txt' into table emp;load data local inpath '/opt/module/hive-3.1.2/datas/loc.txt' into table location;

2.2、全表和特定列查询

-- 查询全表
select * from emp;
-- 查询指定字段
select empno,ename from emp;

2.3、列别名

可以省去 as 。

-- 列别名 as 或者 直接字段后跟 别名
select empno as id,ename name from emp;

  2.3、limit 分页显示

-- 分页显示 limit(begin,len) begin从0开始算起 向下读取len行
select * from emp limit 5;
select * from emp limit 0,3;

2.4、关系运算符(between、in、is Null)

这里只

-- 关系运算符
-- 查询部门id为30或20的员工信息
select * from emp
where deptno in (30,20);
-- 比较运算符
select * from emp where sal =3000;
select * from emp where sal between 500 and 1000;
select * from emp where job is null;

2.5、逻辑运算符(and、or、not)

-- 查询除了20部门和30部门以外的员工信息select * from emp where deptno not IN(30, 20);

 2.6、like 和 Rlike

like 可以用来进行 模糊匹配:

  • % 代表零个或多个字符(任意个字符)。
  • _ 代表一个字符。

Rlike 是 Hive 对like的扩展,使它可以通过Java的正则表达式这个更强大的语言来指定匹配条件。

-- 查找名字以A开头的员工信息
select * from emp where ename LIKE ‘A%’; hiveselect * from emp where ename RLIKE ‘^A’;

3、分组

3.1、group by

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

注意:使用聚合函数必须使用 group by!

在 Hive 中,当你在查询语句中使用聚合函数(如sum())时,你需要使用group by子句来对数据进行分组。这是因为聚合函数会对每个组的数据进行操作,而不是对整个数据集进行操作。

-- 计算没个部门的平均工资
select t.deptno, avg(t.sal) from emp t group by t.deptno;   --用时27s--计算每个部门中每个岗位的最高薪水
select t.deptno,t.job,max(t.sal) from emp t group by t.deptno,t.job;    --用时22s

3.2、having

如果我们要对分组后的结果进行条件过滤,这时候不能使用 where ,需要使用 having。

-- 使用 where 对grou by的结果进行再次过滤
select job,cnt from
(select job,count(*) cnt from emp group by job)t1
where cnt>=2;-- 上面的写法太复杂了 所以有了 having
select job,count(*) cnt from emp having cnt>=2;-- 查询平均工资>1000的部门id
select deptno,avg(sal) avg_sal from emp group by deptno having avg_sal > 1000;

4、Join 语句

4.1、内连接

返回两张表中满足关联条件的行,拼接成一张宽表(因为两张表横向合并,字段增加)

-- 内连接 (返回两张表的所有能关联上(满足e.deptno = d.deptno)的行)
-- 根据部门编号查询出员工的部门名称
select e.empno,e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;

4.2、左外连接

把左表的全部行和右表进行拼接,右表如果不满足拼接条件,则拼接的部分补 NULL。

当执行左外连接时,Hive 会将左表的每一行与右表中满足关联条件的行进行匹配。如果右表中存在匹配的行,则返回左表和右表中匹配行的组合。如果右表中不存在匹配的行,则返回左表的行,右表的部分将用 NULL 值填充。

-- 左外连接 (返回左表的全部行)
select e.empno,e.ename,d.deptno from emp e left join dept d on e.deptno = d.deptno;

4.3、右外连接

把右表的全部行和左表进行拼接,左表如果不满足拼接条件,则拼接的部分补 NULL。

-- 右外连接 (返回右表的全部行)
select e.empno,e.ename,d.deptno from emp e right join dept d on e.deptno = d.deptno;

4.4、满外连接

返回左表和右表中所有的行,以及两者之间满足连接条件的匹配行。如果某一侧的表中没有匹配的行,则返回NULL值。

-- 满外连接
select e.empno,e.ename,d.deptno from emp e full join dept d on e.deptno = d.deptno;

4.5、多表连接

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

-- 用emp表的deptno 关联dept表的deptno字段,再用dept表的loc字段关联location表的loc字段
select * from emp e
join dept don e.deptno = d.deptno
join location l
on d.loc = l.loc;

4.6、笛卡尔集

笛卡尔集会在下面条件下产生
  1. 省略连接条件
  2. 连接条件无效
  3. 所有表中的所有行互相连接
--笛卡尔集 (把a表每一行数据和b表每一行数据关联到一起) 不要轻易使用
--     a  |  1    => (a,1)(b,1)(c,1)
--     b  |  2    => (a,2)(b,2)(c,2)
--     c  |  3    => (a,3)(b,3)(c,3)
-- 结果总行数: a行数*b行数, 3*3=9行
select empno,dname from emp,dept;

4.7、联合(union、union all)

纵向拼接,要求必须字段数相同,字段类型相同。

-- 联合union
-- join 是横向拼接(形成宽表,增加了字段) 而 union是纵向拼接(增加表的数据,也就是两张表的大部分字段的个数和类型必须一致)
-- union去重,union all不去重
select * from emp
where deptno = 30
union
select * from emp
where deptno = 20;

5、排序

5.1、全局排序(Order By)

语法:

select * from 表名 order by 字段 [asc | desc];

asc:升序(默认)

desc:降序

-- 1.全局排序 order by
-- asc: 升序 desc:降序
select * from emp order by sal;

        我们在实际开发中,order by 其实是一个比较危险的操作,因为我们一个 order by 操作的底层中,Map 可能是多个 Map 任务,但是 Reduce 任务默认只有一个。这样的话,如果我们这张表对应的数据源非常大,那么 Reduce 任务的压力可想而知。

        实际开发中,我们更多的时候并不需要整个结果排好序的数据,而往往要的是前几个或者后几个数据,所以我们的 order by 经常是配合 limit 来使用的。这样的性能往往是最好的,因为假如有100w条数据,我们只需要前100个升序的结果,那么我们就可以让 Reduce 任务只拉取每个 Map 任务的前 100 条数据即可。

select * form 表名 order by 字段 limit 100;

5.2、每个Reducer内部排序(Sort By)

作用:指定排序字段。

        对于很大规模的数据,order by 可以保证所有的数据结果保存在一个文件并全局有序,但是很多时候,我们并不需要全局排序,此时可以使用 sort by。

        sort by 为每个 Reduce 任务产生一个排序文件,只能保证每个 Reduce 任务的结果有序,而不是全局有序。

设置 reduce 个数
-- 设置reduce 任务数量为 3
set mapreduce.job.reduces = 3;
查看 reduce 个数
set mapreduce.job.reduces;
测试
-- 根据员工薪资进行降序排序
select * from emp sort by sal desc ;

运行结果: 

我们的数据并不是全局有序,而是分为了3块(reduce 任务个数),各自局部有序。

这里,我在 reduce 任务数为 3 的情况下又测试了一遍 order by,发现结果是全局有序了,说明有两个 reduce 任务没有开启。 

将查询结果导出到文件中
-- 格式化导出
insert overwrite local directory '/opt/module/hive-3.1.2/datas/sortby-result'
row format delimited fields terminated by '\t'
select * from emp sort by sal;

 运行结果:

可以看到,一共导出了3个文件,分别内部有序。

5.3、分区(Distribute By)

作用:指定分区字段

我们 hadoop 默认的分区规则如下:

public int getPartition(K key, V value, int numReduceTasks) {return (key.hashCode() & 2147483647) % numReduceTasks;}

这里,我们指定我们的 Reduce 任务数为 3,这样理论应该产生 3 个分区:

insert overwrite local directory '/opt/module/hive-3.1.2/datas/distributeby-result'
row format delimited fields terminated by '\t'
select * from emp distribute by sal;

运行结果: 

5.4、分区排序(Cluster By)

如果我们的分区字段(distribute by)和排序字段(sort by)是同一个字段的时候,我们可以简写为 cluster by 。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。

select * from emp cluster by deptno;

相当于

select * from emp
sort by deptno
distribute by deptno;

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

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

相关文章

火热报名中 | 2天峰会、20+热门议题,AutoESG 2023数智低碳---中国汽车碳管理创新峰会亮点抢先看!

在碳中和的背景下,减碳之风吹遍全球,而汽车行业则由于产业链长、辐射面广、碳排放总量增长快、单车碳强度高的特点,成为各国碳排放管理的监管重点,聚焦汽车业的碳博弈也逐步升级。 2020年,国务院办公厅印发的《新能源…

douyin 六神x-helios / x-medusa解密记录学习

在某音新版本的抓包中,经常会遇到两个熟悉的字段x-helios ,x-medusa,它是新版本中风控的重要组成部分。 通常而言,我们可以使用像frida,unidbg来模拟计算出六神参数,比如说我们随便找一个23.9版本生成一个…

K折交叉验证——cross_val_score函数使用说明

在机器学习中,许多算法中多个超参数,超参数的取值不同会导致结果差异很大,如何确定最优的超参数?此时就需要进行交叉验证的方法,sklearn给我们提供了相应的cross_val_score函数,可对数据集进行交叉验证划分…

【深度学习实验】卷积神经网络(六):自定义卷积神经网络模型(VGG)实现图片多分类任务

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 构建数据集(CIFAR10Dataset) a. read_csv_labels() b. CIFAR10Dataset 2. 构建模型(FeedForward&…

Unity:2D游戏设置相机orthographicSize

目录 根据设备分辨率动态设置相机 orthographicSize 根据设备分辨率动态设置相机 orthographicSize 2d游戏里面相机的Orthan.size确定的是高度,宽度是按照屏幕的宽高比计算出来的cameraWidthSize camera.Orthographic.size*(Screen.Width/Screen.height)我在游戏…

嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理③

嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理③ 第十八章 Linux系统对中断的处理 ③18.5 编写使用中断的按键驱动程序 ③18.5.1 编程思路18.5.1.1 设备树相关18.5.1.2 驱动代码相关 18.5.2 先编写驱动程序18.5.2.1 从设备树获得 GPIO18.5.2.2 从 GPIO获得中断号18.5…

【JVM】第三篇 JVM对象创建与内存分配机制深度剖析

目录 一. JVM对象创建过程详解1. 类加载检查2. 分配内存2.1 如何划分内存?2.2 并发问题3. 初始化4. 设置对象头5. 执行<init>方法二. 对象头和指针压缩详解三. JVM对象内存分配详解四.逃逸分析 & 栈上分配 & 标量替换详解1. 逃逸分析 & 栈上分配2. 标量替换…

查看react内置webpack版本的方法

yarn list --pattern webpack npm ls --pattern webpack

十七,IBL-打印各个Mipmap级别的hdr环境贴图

预滤波环境贴图类似于辐照度图&#xff0c;是预先计算的环境卷积贴图&#xff0c;但这次考虑了粗糙度。因为随着粗糙度的增加&#xff0c;参与环境贴图卷积的采样向量会更分散&#xff0c;导致反射更模糊&#xff0c;所以对于卷积的每个粗糙度级别&#xff0c;我们将按顺序把模…

新型信息基础设施IP追溯:保护隐私与网络安全的平衡

随着信息技术的飞速发展&#xff0c;新型信息基础设施在全球范围内日益普及&#xff0c;互联网已经成为我们社会和经济生活中不可或缺的一部分。然而&#xff0c;随着网络使用的增加&#xff0c;隐私和网络安全问题也引发了广泛关注。在这个背景下&#xff0c;IP&#xff08;In…

【C++】单例模式

文章目录 一. 介绍二. 饿汉模式三. 懒汉模式四. 饿汉模式和懒汉模式对比 一. 介绍 单例模式是属于设计模式的一种&#xff0c;那什么是设计模式呢&#xff1f; 设计模式&#xff08;Design Pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总…

从MVC到DDD,该如何下手重构?

作者&#xff1a;付政委 博客&#xff1a;bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 大家好&#xff0c;我是技术UP主小傅哥。多年的 DDD 应用&#xff0c;使我开了技术的眼界&#xff01; MVC 旧工程腐化严重&#xff0c;…

【嵌入式】使用MultiButton开源库驱动按键并控制多级界面切换

目录 一 背景说明 二 参考资料 三 MultiButton开源库移植 四 设计实现--驱动按键 五 设计实现--界面处理 一 背景说明 需要做一个通过不同按键控制多级界面切换以及界面动作的程序。 查阅相关资料&#xff0c;发现网上大多数的应用都比较繁琐&#xff0c;且对于多级界面的…

ahk系列——ahk_v2实现win10任意界面ocr

前言&#xff1a; 不依赖外部api接口&#xff0c;界面简洁&#xff0c;翻译快速&#xff0c;操作简单&#xff0c; 有网络就能用 、还可以把ocr结果非中文翻译成中文、同样可以识别中英日韩等60多个国家语言并翻译成中文&#xff0c;十分的nice 1、所需环境 windows10及其以上…

软件设计师_数据库系统_学习笔记

文章目录 3.1 数据库模式3.1.1 三级模式 两级映射3.1.2 数据库设计过程 3.2 ER模型3.3 关系代数与元组演算3.4 规范化理论3.5 并发控制3.6 数据库完整性约束3.7 分布式数据库3.8 数据仓库与数据挖掘 3.1 数据库模式 3.1.1 三级模式 两级映射 内模式直接与物理数据库相关联的 定…

如何初始化一个vue项目

如何初始化一个vue项目 安装 vue-cli 后 ,终端执行 vue ui npm install vue-cli --save-devCLI 服务 | Vue CLI (vuejs.org) 等一段时间后 。。。 进入项目仪表盘 设置其他模块 项目构建后目录 vue.config.js 文件相关配置 官方vue.config.js 参考文档 https://cli.vuejs.o…

嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理②

嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理② 第十八章 Linux系统对中断的处理 ②18.3 Linux中断系统中的重要数据结构18.3.1 irq_desc数组18.3.2 irqaction结构体18.3.3 irq_data结构体18.3.4 irq_domain结构体18.3.5 irq_chip结构体 18.4 在设备树中指定中断_在…

区块链(8):p2p去中心化之websoket服务端实现业务逻辑

1 业务逻辑 例如 peer1和peer2之间相互通信 peer1通过onopen{ write(Mesage(QUERY_LATEST))} 向peer2发送消息“我要最新的区块”。 peer2通过onMessage收到消息,通过handleMessage方法对消息进行处理。 handleMessage根据消息类型进行处理 RESPONSE_BLOCKCHAIN:返回区块链…

基于Java的游戏检索系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户功能已注册用户的功能后台功能管理员功能具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博…

BI神器Power Query(25)-- 使用PQ实现表格多列转换(1/3)

实例需求&#xff1a;原始表格包含多列属性数据,现在需要将不同属性分列展示在不同的行中&#xff0c;att1、att3、att5为一组&#xff0c;att2、att3、att6为另一组&#xff0c;数据如下所示。 更新表格数据 原始数据表&#xff1a; Col1Col2Att1Att2Att3Att4Att5Att6AAADD…