Hive中的基本查询
Hive中的基本查询
@
0,数据准备
1)先创建两张表,一张部门表,三个字段,部门id int,部门名 string, 地址编号 int。
dept:
2)再创建一张员工信息表,八个字段,员工编号 int,员工名 string,员工岗位 string,员工的上级编号 int,入职时间 string,工资 double,奖金 double,部门id int。
emp:
3)创建部门表
Hive需要运作于hadoop集群,请先开启hadoop集群,再运行Hive
4)创建员工表
5)导入上面准备的数据
1,基本查询
1)全表查询和特定列查询
全表查询(不推荐)
选择特定列查询(推荐)
2)列别名
重命名一个列,便于后续计算和使用,紧跟列名之后,可以在中间加AS关键字,也可以不加
3)算术运算符
运算符 | 描述 |
---|---|
A+B | A和B 相加 |
A-B | A减去B |
A*B | A和B 相乘 |
A/B | A除以B |
A%B | A对B取余 |
A&B | A和B按位取与 |
A^B | A和B按位取异或 |
~A | A按位取反 |
例如查询出所有员工薪水加1000后的数据 |
4)常用函数
求总行数(count)
求工资的最大值(max)
求工资的最小值(min)
求工资的总和(sum)
求工资的平均值(avg)
5)limit和where语句
因为查询的数据量级无法知晓,所以保险起见还是用limit语句来限制返回的行数
where语句主要针对不满足要求的数据进行过滤
查询出薪水大于1000的所有员工
注意:where子句中不能使用字段别名。
6)比较运算符
(2)查询工资在500到1000的员工信息
(3)查询comm为空的所有员工信息
(4)查询工资是1500或5000的员工信息
7)like和RLike
(1)使用LIKE运算选择类似的值
(2)选择条件可以包含字符或数字:% 代表零个或多个字符(任意个字符)。_ 代表一个字符。
(3)RLIKE子句
RLIKE子句是Hive中这个功能的一个扩展,其可以通过Java的正则表达式这个更强大的语言来指定匹配条件。
案例实操
(1)查找名字以S开头的员工信息
(2)查找名字以S结尾的员工信息
(3)查找名字中带有S的员工信息
8)逻辑运算符(and、or、not)
案例实操
(1)查询薪水大于1000,部门是30
(2)查询薪水大于1000,或者部门是30
(3)查询除了20部门和30部门以外的员工信息
2,分组
1)group by 语句
GROUP BY语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。
案例实操:
(1)计算emp表每个部门的平均工资
(2)计算emp每个部门中每个岗位的最高薪水
2)having 语句
首先要先了解having和where的不同点
1)having与where不同点
(1)where后面不能写分组聚合函数,而having后面可以使用分组聚合函数。
(2)having只用于group by分组统计语句。
案例实操
(1)求每个部门的平均薪水大于2000的部门
求每个部门的平均工资
求每个部门的平均薪水大于2000的部门
3,Join 语句
1)等值join
Hive支持通常的SQL JOIN语句,但是sql只支持等值连接,(Hive3.1.2)支持非等值连接。
案例实操
(1)根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门名称;
2)表的别名
1)好处
(1)使用别名可以简化查询。
(2)使用表名前缀可以提高执行效率。
案例实操
合并员工表和部门表
3)内连接
内连接:只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来。
4)左外连接
左外连接:JOIN操作符左边表中符合WHERE子句的所有记录将会被返回。
5)右外连接
(左外连接和右外连接其实只要记住一个就行了)
右外连接:JOIN操作符右边表中符合WHERE子句的所有记录将会被返回。
6)满外连接
满外连接:将会返回所有表中符合WHERE语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用NULL值替代。
7)多表连接
注意:连接 n个表,至少需要n-1个连接条件。例如:连接三个表,至少需要两个连接条件。
数据准备 在/opt/module/hive/datas/下:vim location.txt
两个字段,地址编号 int,地址名 string。
1)创建位置表
2)导入数据
3)多表连接查询
大多数情况下,Hive会对每对JOIN连接对象启动一个MapReduce任务。本例中会首先启动一个MapReduce job对表e和表d进行连接操作,然后会再启动一个MapReduce job将第一个MapReduce job的输出和表l;进行连接操作。
注意:为什么不是表d和表l先进行连接操作呢?这是因为Hive总是按照从左到右的顺序执行的。
8)笛卡尔积
1)笛卡尔集会在下面条件下产生
(1)省略连接条件
(2)连接条件无效
(3)所有表中的所有行互相连接
案例实操
4,排序
1)全局排序
Order By:全局排序,只有一个Reducer
1)使用 ORDER BY 子句排序
ASC(ascend): 升序(默认)
DESC(descend): 降序
2)ORDER BY 子句在SELECT语句的结尾
案例实操
(1)查询员工信息按工资升序排列
(2)查询员工信息按工资降序排列
(3)按照别名排序
按照员工薪水的2倍排序
(4)多个列排序
按照部门和工资升序排序
(5)每个Reduce内部排序(Sort By)
Sort By:对于大规模的数据集order by的效率非常低。在很多情况下,并不需要全局排序,此时可以使用sort by。
Sort by为每个reducer产生一个排序文件。每个Reducer内部进行排序,对全局结果集来说不是排序。
1)设置reduce个数
2)查看设置reduce个数
3)根据部门编号降序查看员工信息
4)将查询结果导入到文件中(按照部门编号降序排序)
2)分区
Distribute By: 在有些情况下,我们需要控制某个特定行应该到哪个reducer,通常是为了进行后续的聚集操作。distribute by 子句可以做这件事。distribute by类似MR中partition(自定义分区),进行分区,结合sort by使用。
对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute by的效果。
案例实操:
(1)先按照部门编号分区,再按照员工编号薪资排序。
注意:
- distribute by的分区规则是根据分区字段的hash码与reduce的个数进行模除后,余数相同的分到一个区。
- Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前。
- 演示完以后mapreduce.job.reduces的值要设置回-1,否则下面分区or分桶表load跑mr的时候有可能会报错
(2)分区排序(Cluster By)
当distribute by和sort by字段相同时,可以使用cluster by方式。
cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。
以下两种写法等价
注意:按照部门编号分区,不一定就是固定死的数值,可以是20号和30号部门分到一个分区里面去。
分区表和分桶表
分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。
1,分区表的基本操作
1)引入分区表(需要根据日期对日志进行管理, 通过部门信息模拟)
2)创建分区表语法
注意:分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。
3)加载数据到分区表中
(1)数据准备
dept_20200401.log
dept_20200402.log
dept_20200403.log
(2)加载数据
注意:分区表加载数据时,必须指定分区
4)查询分区表中数据
单分区查询
多分区联合查询
5)查看分区表有多少分区
6)增加分区
创建单个分区
7)删除分区
删除单个分区
同时删除多个分区(分区之间必须有逗号)
8)查看分区表结构
2,分区表二级分区
一天的日志数据量也很大,如何再将数据拆分?
1)创建二级分区表
2)正常的加载数据
(1)加载数据到二级分区表中
(2)查询分区数据
3)把数据直接上传到分区目录上,让分区表和数据产生关联的三种方式
(1)方式一:上传数据后修复
上传数据
查询数据(查询不到刚上传的数据)
执行修复命令
再次查询数据
(2)方式二:上传数据后添加分区
上传数据
执行添加分区
查询数据
(3)方式三:创建文件夹后load数据到分区
创建目录
上传数据
查询数据
3,动态分区调整
关系型数据库中,对分区表Insert数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive中也提供了类似的机制,即动态分区(Dynamic Partition),只不过,使用Hive的动态分区,需要进行相应的配置。
1)开启动态分区参数设置
(1)开启动态分区功能(默认true,开启)
(2)设置为非严格模式(动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区。)
(3)在所有执行MR的节点上,最大一共可以创建多少个动态分区。默认1000
(4)在每个执行MR的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错。
(5)整个MR Job中,最大可以创建多少个HDFS文件。默认100000
(6)当有空分区生成时,是否抛出异常。一般不需要设置。默认false
2)案例实操
需求:将dept表中的数据按照地区(loc字段),插入到目标表dept_partition的相应分区中。
(1)创建目标分区表
(2)设置动态分区
(3)查看目标分区表的分区情况
4,分桶表
分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理的分区。对于一张表或者分区,Hive 可以进一步组织成桶,也就是更为细粒度的数据范围划分。
分桶是将数据集分解成更容易管理的若干部分的另一个技术。
分区针对的是数据的存储路径;分桶针对的是数据文件。
1)先创建分桶表,通过直接导入数据文件的方式
(1)数据准备
(2)创建分桶表
(3)查看表结构
(4)导入数据到分桶表中(hive新版本load数据可以直接跑mr(也会有点问题),老版的hive需要将数据传到一张表里,再通过查询的方式导入到分桶表里面。)
(5)查询分桶的数据
分桶规则:
根据结果可知:Hive的分桶采用对分桶字段的值进行哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
今天的分享就到这,下次再见。
__EOF__

本文链接:https://www.cnblogs.com/xiaolongbaoxiangfei/p/15801058.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏