6.1 Hive基础查询:SELECT与WHERE

1. 实战概述

  • 本次实战围绕Hive基础查询展开,通过学生表和雇员表,演示了SELECTWHERE的多种用法,包括全表查询、数值/字符串条件过滤、范围查询(BETWEEN)、集合查询(IN)、模糊匹配(LIKE)及复杂字段(如struct类型)处理,验证了HiveQL在结构化数据检索中的灵活性与高效性。

2. 实战步骤

在这里插入图片描述

3. 实战总结

  • 本次Hive基础查询实战系统演练了SELECTWHERE子句的核心用法。通过对学生表t_student和雇员表employee的操作,全面实践了全表查询、数值比较(如年龄>19)、范围筛选(BETWEEN)、集合匹配(IN)、模糊查询(LIKE)以及复合条件(AND/OR)等常见场景,并成功处理了嵌套结构字段(如address.struct)。实验验证了HiveQL语法与标准SQL的高度兼容性,同时体现了分区裁剪优化潜力及对复杂数据类型的解析能力。所有查询均正确返回预期结果,说明Hive能高效支持日常数据分析任务。整个过程夯实了基础查询技能,为后续聚合、连接等高级操作奠定了坚实基础。
广 州 商 学 院 实验报告(第 10次) 班级: 学号: 姓名: 完成时间: 实验名称: HiveSQL常用查询 实验时间: 年 月 日 一.实验目的 掌握Hive的常用查询Hive常用函数、常用查询语句、分区表、分桶表、HiveSQL实现wordcount、排名函数使用 二.实验内容 实验1 掌握Hive的常用查询Hive常用函数、常用查询语句、分区表、分桶表、HiveSQL实现wordcount、排名函数使用 三.实验主要步骤 前置条件:已经安装Hadoop伪分布集群 实验1掌握Hive的常用命令操作 1、启动Hadoop 2、启动Docker的MySQL容器 3、启动Hive服务 4、查看数据库 5、常用函数 6Where 语句 7、比较运算符使用 8、Like运用 9、逻辑运算符(And/Or/Not) 10、分组操作 11、Having 语句 12、排序 13、分区表 14、分桶表 15、Hive实现wordcout 16、排名函数 四.实验结果测试 每一步尽可能截图 实验1掌握Hive的常用命令操作 1、启动Hadoop 2、启动Docker的MySQL容器 3、启动Hive服务 4、查看数据库 5、常用函数 以下皆为聚合函数,运行是要走MR的 5.1求总行数(count) 5.2求工资的最大值(max) 5.3求工资的最小值(min) 5.4求工资的总和(sum) 5.5求工资的平均值(avg) 5.6 Limit 语句(分页查询6Where 语句 6.1查询出薪水大于 1000 的所有员工 注意:where 子句中不能使用字段别名。 7、比较运算符使用 7.1查询出薪水等于 5000 的所有员工 ​ 7.2查询工资在 500 到 1000 的员工信息 7.3查询 comm 为空的所有员工信息 7.4查询工资是 1500 或 5000 的员工信息 8、Like运用 8.1查找名字以 A 开头的员工信息   8.2查找名字中第二个字母为 A 的员工信息     8.3查找名字中带有 A 的员工信息 9、逻辑运算符(And/Or/Not) 9.1查询薪水大于 1000,部门是 30 9.2查询薪水大于 1000,或者部门是 30 9.3查询除了 20 部门和 30 部门以外的员工信息 10、分组操作 10.1计算 emp 表每个部门的平均工资 10.2计算 emp 每个部门中每个岗位的最高薪水 11、Having 语句 11.1求每个部门的平均工资     11.2求每个部门的平均薪水大于 2000 的部门 11.3根据员工表和部门表中的部门编号相等,查询员工编号、员工名称、部门编号和部门名称 12、排序 12.1查询员工信息按工资升序排列 12.2查询员工信息按工资降序排列 13、分区表 分区表基本操作 13.1引入分区表(需要根据日期对日志进行管理, 通过部门信息模拟) 13.2创建分区表语法 13.3加载数据到分区表中 (1) 数据准备 (2) 加载数据 13.4查询分区表中数据 单分区查询 多分区联合查询 13.5增加分区 创建单个分区 同时创建多个分区 13.6删除分区 删除单个分区 同时删除多个分区 13.7查看分区表有多少分区 13.8查看分区表结构 14、分桶表 14.1先创建分桶表 (1)数据准备 上传到hdfs目录 14.2创建分桶表 14.3查看表结构 14.4导入数据到分桶表中,load 的方式 14.5查看创建的分桶表中是否分成 4 个桶 14.6查询分桶的数据 15、Hive实现wordcout 15.1创建一个表 15.2加载数据到Hive15.3一个SQL语句直接输入统计结果 15.4使用一个表保存统计结果 15.5查询统计结果 16、排名函数 16.1先创建一个学生分数表 16.2准备数据 16.3导入数据 16.4 ROW_NUMBER()函数 16.5 RANK()函数 16.6 DENSE_RANK()函数 五.心得体会自我评价 (不少于30字,重点描述实验过程有没有遇到问题,遇到的问题是如何解决的) 六.教师评分
12-09
普通文本型问题,直接回答如下: 该实验报告为一次关于 **HiveSQL常用查询操作** 的实践训练,内容系统地涵盖了Hive中常见的数据查询处理功能。以下是针对实验内容的详细解析指导说明,帮助理解每一步的操作目的技术要点。 --- ### 实验环境准备 1. **启动Hadoop**:确保HDFS和YARN正常运行,为Hive提供底层存储计算支持。 2. **启动Docker中的MySQL容器**:Hive的元数据存储依赖于外部数据库(如MySQL),需提前启动。 3. **启动Hive服务**:通过`hive`命令进入CLI界面,开始执行HiveQL语句。 --- ### 核心操作详解 #### 4. 查看数据库 ```sql SHOW DATABASES; USE default; ``` 用于查看当前可用数据库并切换到目标库。 --- #### 5. 常用聚合函数(需MR执行) | 函数 | 示例 | |------|------| | `COUNT(*)` | 统计总行数 | | `MAX(sal)` | 最高工资 | | `MIN(sal)` | 最低工资 | | `SUM(sal)` | 工资总和 | | `AVG(sal)` | 平均工资 | | `LIMIT n` | 限制返回前n条记录 | > 注意:这些聚合操作在Hive中会触发MapReduce任务。 --- #### 6. WHERE语句 ```sql SELECT * FROM emp WHERE sal > 1000; ``` 过滤条件写在WHERE后,**不能使用SELECT中的列别名**。 --- #### 7. 比较运算符 - 等值:`WHERE sal = 5000` - 区间:`WHERE sal BETWEEN 500 AND 1000` - 空值判断:`WHERE comm IS NULL` - 多值匹配:`WHERE sal IN (1500, 5000)` --- #### 8. LIKE运用(模式匹配) - 以A开头:`WHERE ename LIKE 'A%'` - 第二个字符是A:`WHERE ename LIKE '_A%'` - 包含A:`WHERE ename LIKE '%A%'` --- #### 9. 逻辑运算符 - `AND`:`WHERE sal > 1000 AND deptno = 30` - `OR`:`WHERE sal > 1000 OR deptno = 30` - `NOT`:`WHERE deptno NOT IN (20, 30)` --- #### 10. 分组操作(GROUP BY) ```sql -- 按部门分组求平均工资 SELECT deptno, AVG(sal) FROM emp GROUP BY deptno; -- 按部门和岗位分组求最高工资 SELECT deptno, job, MAX(sal) FROM emp GROUP BY deptno, job; ``` --- #### 11. HAVING语句 HAVING用于对分组后的结果进行筛选: ```sql -- 部门平均工资大于2000 SELECT deptno, AVG(sal) AS avg_sal FROM emp GROUP BY deptno HAVING avg_sal > 2000; ``` 多表连接示例: ```sql SELECT e.empno, e.ename, d.deptno, d.dname FROM emp e JOIN dept d ON e.deptno = d.deptno; ``` --- #### 12. 排序 - 升序:`ORDER BY sal ASC` - 降序:`ORDER BY sal DESC` - 可结合LIMIT实现分页:`LIMIT 10 OFFSET 0` --- #### 13. 分区表(Partitioned Table) 用途:按某一字段(如日期、部门)划分数据目录,提升查询效率。 ##### 创建语法: ```sql CREATE TABLE emp_partitioned ( empno INT, ename STRING, job STRING, mgr INT, hiredate STRING, sal DOUBLE, comm DOUBLE ) PARTITIONED BY (deptno INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; ``` ##### 加载数据: ```sql LOAD DATA LOCAL INPATH './data/emp_10.txt' INTO TABLE emp_partitioned PARTITION (deptno=10); ``` ##### 查询: ```sql -- 单分区 SELECT * FROM emp_partitioned WHERE deptno = 10; -- 多分区联合查询 SELECT * FROM emp_partitioned WHERE deptno IN (10, 20); ``` ##### 增删分区: ```sql -- 添加单个分区 ALTER TABLE emp_partitioned ADD PARTITION (deptno=40); -- 删除多个分区 ALTER TABLE emp_partitioned DROP PARTITION (deptno=30), PARTITION (deptno=40); ``` ##### 查看分区信息: ```sql SHOW PARTITIONS emp_partitioned; DESCRIBE FORMATTED emp_partitioned; ``` --- #### 14. 分桶表(Bucketed Table) 作用:对某字段哈希取模,将数据均匀分布到固定数量的文件中,优化join和采样性能。 ##### 设置参数: ```sql SET hive.enforce.bucketing=true; SET mapreduce.job.reduces=4; ``` ##### 创建分桶表: ```sql CREATE TABLE emp_bucketed ( empno INT, ename STRING, job STRING, mgr INT, hiredate STRING, sal DOUBLE, comm DOUBLE, deptno INT ) CLUSTERED BY (empno) INTO 4 BUCKETS ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; ``` ##### 导入数据(需启用桶映射): ```sql INSERT INTO TABLE emp_bucketed SELECT * FROM emp_sort ORDER BY empno; ``` ##### 查看分桶情况: ```sql -- 查看HDFS上生成的文件数是否为4 dfs -ls /user/hive/warehouse/emp_bucketed; ``` --- #### 15. Hive实现WordCount 经典MapReduce案例移植至Hive。 ##### 步骤: 1. 创建文本表: ```sql CREATE TABLE docs(line STRING); ``` 2. 加载文本数据: ```sql LOAD DATA LOCAL INPATH './words.txt' INTO TABLE docs; ``` 3. 拆词统计: ```sql SELECT word, COUNT(*) AS cnt FROM ( SELECT explode(split(line, ' ')) AS word FROM docs ) t GROUP BY word ORDER BY cnt DESC; ``` 4. 结果保存: ```sql CREATE TABLE word_count_result AS SELECT word, COUNT(*) AS cnt FROM ( SELECT explode(split(line, ' ')) AS word FROM docs ) t GROUP BY word; ``` --- #### 16. 排名函数 假设有一个学生成绩表 `score(student, subject, score)`。 ##### ROW_NUMBER():连续排名,无重复 ```sql SELECT student, subject, score, ROW_NUMBER() OVER (PARTITION BY subject ORDER BY score DESC) AS rn FROM score; ``` ##### RANK():跳跃排名,相同分数同名次,跳级 ```sql RANK() OVER (PARTITION BY subject ORDER BY score DESC) AS rk ``` ##### DENSE_RANK():密集排名,相同分数同名次,不跳级 ```sql DENSE_RANK() OVER (PARTITION BY subject ORDER BY score DESC) AS drk ``` --- ### 心得体会自我评价(参考模板) > 本次实验让我全面掌握了HiveSQL的基本查询高级特性。在创建分区表时曾因路径权限问题导致加载失败,后通过检查HDFS目录权限解决。分桶表导入数据时忘记设置`hive.enforce.bucketing=true`,导致未真正分桶,经查阅文档修正。整体流程清晰,收获颇丰。 --- ### 知识点详解(不超过三项) - **HiveQL聚合分组**:使用`GROUP BY`配合`COUNT/MAX/SUM/AVG`等函数完成数据汇总,触发MapReduce作业。 - **分区分桶机制**:分区按列值划分目录结构;分桶则通过对键哈希实现数据均衡分布,提升查询效率。 - **窗口函数应用**:`ROW_NUMBER`, `RANK`, `DENSE_RANK`基于`OVER()`子句实现排序,适用于排名场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酒城译痴无心剑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值