大数据用户画像需求分析
第一章课后习题
选择题
(1)Hive 是建立在( )之上的数据仓库。
A. HDFS
B. MapReduce
C. Hadoop
D. HBase
(2)【多选】下列关于常见的大数据开发工具描述中,正确的是( )。
A. Excel 具备多种强大功能,如创建表单、数据透视表、VBA 等
B. SPSS 是世界上最早采用图形菜单驱动界面的统计软件,其特点是操作界面极为友好,输出结果较为美观
C. Python 是一种面向对象、解释型的程序设计语言,具备非常强大的数据分析能力
D. Hive 的底层存储依赖于 HDFS,因此 Hive 实质是一款基于 HDFS 的 MapReduce 计算框架
(3)【多选】Hive 架构包含下列( )组件。
A. CLI 和 JDBC/ODBC
B. ThriftServer
C. Metastore
D. HWI 和 Driver
(4)【多选】Hive 的特点包括( )。
A. HQL 与 SQL 有着相似的语法,大大提高了开发效率
B. Hive 支持运行在不同的框架上,包括 YARN、Tez、Spark、Flink 等
C. Hive 支持 HDFS 与 HBase 上的即席分析
D. Hive 不支持用户自定义的函数、脚本等
(5)【多选】下列关于 Hive 的适用场景的描述中,正确的有( )。
A. Hive 适用于非结构化数据的离线分析统计场景
B. Hive 的执行延迟比较低,因此适用于对实时性要求比较高的场景
C. Hive 的优势在于处理大数据,因此适用于大数据(而非小数据)处理的场景
D. Hive 的最佳适用场景是大数据集的批处理作业,如网络日志分析
(部署开发环境章节课后习题)
第二章课后习题
选择题
(1)【多选】下列关于 VMware 虚拟网络的描述中正确的是( )。
A. VMware 提供了 3 种网络工作模式,即桥接模式、仅主机模式、NAT 模式
B. NAT 模式可使集群主机 IP 地址限制在一个相对独立的子网内,并能有效避免与外部 IP 地址产生冲突
C. VMnet8 是用于虚拟网络 NAT 模式的虚拟交换机
D. 在 NAT 模式中,主机网卡直接与虚拟 NAT 设备相连,然后虚拟 NAT 设备与虚拟 DHCP 服务器一起连接在虚拟交换机 VMnet8 上
(2)下列关于虚拟机的部署的描述中,( )是错误的。
A. VMware Workstation 16 pro 不允许安装在 Windows 7 环境下
B. 在 VMware 里部署虚拟机采用 NAT 模式的优点是在网络发生变化时避免重新编址
C. 在集群系统规划中,多台主机的 IP 地址必须是连续的,否则集群不能正常运行
D. 在 CentOS 6 下修改完网卡 IP 地址后,可使用 service network restart 命令,让网卡设置立即生效
(3)【多选】下列关于 Xshell 和 Xftp 的描述中,正确的是( )。
A. Xshell 是由 NetSarang 公司开发的功能强大的安全终端模拟软件,支持 SSH1、SSH2 和 Telnet 协议
B. Xftp 是由 NetSarang 公司开发的功能强大的 SFTP、FTP 文件传输软件
C. Xshell 和 Xftp 可使用用户密码认证连接主机,也可使用证书认证连接主机
D. Xshell 和 Xftp 可替代 VMware Workstation
(4)【多选】下列关于 Hive CLI 的描述中,不正确的是( )。
A. Hive CLI 是客户端与 Hive 进行交互的 3 种主要方式之一
B. 在使用 Hive 的过程中,用户可以不退出 Hive,在 Hive CLI 里执行 Linux Shell 命令和 Hadoop dfs 命令
C. 在 Hive CLI 中执行 Hadoop dfs 命令,将 Hadoop 命令中的关键字 “hadoop” 去掉,然后以分号结尾
D. 在 Linux 的 Shell 命令行也可以执行 Hive 查询,主要通过 hive -e 或 hive -f 命令实现
(5)【多选】下列关于 NTP 服务的描述中,正确的是( )。
A. 在 CentOS 6 中可执行命令 yum -y install ntp 安装 NTP 服务
B. Slave 主机必须和 Master 主机保持时间同步,这样 Hadoop 集群才可以正常启动运行
C. VMware 软件关闭后,必须重新手动同步一次 NTP 服务,否则时间可能会有差异
D. 由于防火墙的限制会影响 NTP 服务的运行,可执行命令 service iptables stop``chkconfig iptables off 永久关闭防火墙
操作题
(1)在个人 Windows 环境下,通过虚拟机 VMware Workstation 15/16 完成 Hadoop 单机运行环境的部署工作。
(2)在个人 Windows 环境下,通过虚拟机 VMware Workstation 15/16 完成 Hadoop 伪分布式运行环境的部署工作。
(Hive 数据存储与处理章节)
第三章课后习题
1. 选择题
(1)【多选】Hive 中的基础数据类型包括( )。
A. 整型、浮点型
B. 字符串类型、布尔类型
C. 二进制
D. 时间类型
(2)【多选】Hive 几种常用的复杂数据类型,包括( )。
A. 数组
B. 映射
C. 结构体
D. 联合体
(3)下列有关 Hive 表的描述中,不正确的是( )。
A. 根据存储位置,Hive 表可分为内部表和外部表
B. Hive 默认创建的表是内部表
C. 内部表被删除之后,元数据和实际数据都会被删除
D. 外部表被删除之后,元数据不会被删除
(4)下列有关 Hive 复杂数据类型的描述中,不正确的是( )。
A. 数组是具有相同类型变量的集合,变量称为数组元素,每个数组元素都有一个索引,索引从 0 开始
B. 映射是键值对集合,键和值都可以是任意类型
C. 结构体封装了一组有名字的字段(Named Field),其可以是任意的基础数据类型
D. 在给定的任何一个时刻,联合体可以用于保存指定数据类型中的任意一种类型的数据
(5)下列关于 Hive 数据库操作语句 CREATE DATABASE 的描述中,不正确的是( )。
A. CREATE DATABASE 是创建数据库语句,也可以使用 CREATE SCHEMA 代替
B. 创建数据库时,可以使用 IF NOT EXISTS 来判断创建的数据库是否存在,若不存在则创建,若存在则不创建
C. COMMENT 是必选项,用来表示数据库的相关描述
D. LOCATION 是可选项,用于指定数据库在 HDFS 自定义存储位置
2. 操作题
某学校为了解学生的基本情况,想通过 Hive 实现学生数据的简单分析,因此需在 Hive 数据库 TestDB 中创建学生数据表,学生数据表字段说明如下:
表 3-16 学生数据表字段说明
| 字段 | 描述 | 数据类型 |
|---|---|---|
sid | 学号 | STRING |
name | 姓名 | STRING |
age | 年龄 | INT |
height | 身高(米) | FLOAT |
class | 班级 | STRING |
address | 家庭地址 | STRUCT<street:STRING,district:STRING,city:STRING,zip:INT> |
members | 家庭成员 <关系,姓名> | MAP<STRING, STRING> |
学生数据表创建要求如下:
(1)在数据库 TestDB 中创建内部表 student,并导入数据。
(2)在数据库 TestDB 中创建外部表 student_ext,数据文件存储位置为 /test/hive/ext(若不存在该存储位置,则自行创建)。
(3)在数据库 TestDB 中创建分区表 student_part,指定文件存储位置为 /test/hive/part(若不存在该存储位置,则自行创建),以 city 和 district 作为分区条件。
实训
创建轮船乘客表并导入数据至表中
1. 实训要点
(1)掌握 Hive 数据库的创建操作。
(2)掌握在 Hive 中创建表、导入数据的操作。
2. 需求说明
为提升业务水平,轮船公司需要对乘坐过轮船的乘客数据进行分析处理,轮船公司已将乘客数据导出成文件 train.csv,乘客数据字段说明如表 3-15 所示。为便于对乘客数据进行分析,现将乘客数据导入 Hive 数据仓库。
表 3-15 乘客数据字段说明
| 字段 | 描述 | 类型 |
|---|---|---|
| PassengerId | 游客 ID | INT |
| Pclass | 船舱等级(1、2、3) | INT |
| Name | 姓名 | STRING |
| Sex | 性别 | STRING |
| Age | 年龄 | INT |
| SibSp | 兄弟姐妹数 | INT |
| Parch | 父母小孩数 | INT |
| Ticket | 票编号 | STRING |
| Fare | 票价 | DOUBLE |
| Cabin | 座位号 | STRING |
| Embarked | 登船港口 | STRING |
3. 实现思路及步骤
(1)创建数据库 TitanicDB。
(2)根据表 3-15 创建表 Train。
(3)将 train.csv 文件通过 Xftp 上传至 Linux 系统 /opt 目录下,使用 “sed” 命令删除首行字段名。
(4)导入乘客数据至表 Train,并使用命令 “SELECT * FROM Train LIMIT 5;” 查询表 Train 中的前 5 行数据。
配套实操 SQL 参考
--1.建库
CREATE DATABASE IF NOT EXISTS TitanicDB;
USE TitanicDB;
--2.建表(逗号分隔,文本格式)
CREATE TABLE IF NOT EXISTS Train(
PassengerId INT,
Pclass INT,
Name STRING,
Sex STRING,
Age INT,
SibSp INT,
Parch INT,
Ticket STRING,
Fare DOUBLE,
Cabin STRING,
Embarked STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;#Linux删除表头命令
sed -i '1d' /opt/train.csv--导入数据
LOAD DATA LOCAL INPATH '/opt/train.csv' INTO TABLE Train;
--查询前5条
SELECT * FROM Train LIMIT 5;第四章课后习题
1. 选择题
(1)下列说法中错误的是( )。
A. 通过设置 “hive.cli.print.header” 属性的值为 true,可以在查询结果中显示列名
B. 设置 “hive.resultset.use.unique.column.name” 属性的值为 true,则查询结果中显示的列名前面会带着表名
C. 通过 “set hive.cli.print.header=true;” 语句设置之后,退出并再次登录 Hive,仍然会在查询结果中显示列名
D. “set hive.support.quoted.identifiers=none;” 代表引号不具有任何意义,可以在 SELECT 语句中使用正则表达式指定列
(2)在 SELECT 语句中,可以出现在 SELECT 关键字之后的内容不包括( )。
A. 字段名
B. 聚合函数
C. 表名
D. 算术表达式
(3)如果设置属性值的代码如下,那么下列语句中能够正确使用正则表达式指定列的是( )。
set hive.support.quoted.identifiers=none;A. SELECT name,sa.* FROM employees;
B. SELECT name,'sa.*' FROM employees;
C. SELECT name,sa.* FROM employees;
D. SELECT name,"sa.*" FROM employees;
(4)可以放在 LIKE 关键字后面的内容不包括( )。
A. 包含 “%” 通配符的匹配字符串
B. 正则表达式
C. 包含 “_” 通配符的匹配字符串
D. 普通字符串
(5)下列无法实现降序排列的关键字是( )。
A. ORDER BY
B. SORT BY
C. DISTRIBUTE BY 和 SORT BY
D. CLUSTER BY
(6)可以放在 WHERE 关键字之后的内容是( )。
A. COUNT 函数
B. AVG 函数
C. LIKE 关键字
D. SUM 函数
(7)下列关于 DISTINCT 关键字的描述错误的是( )。
A. 可以在聚合函数中使用 DISTINCT 关键字,先进行数据去重,再执行聚合函数
B. DISTINCT 关键字用于过滤重复数据
C. DISTINCT 关键字与 GROUP BY 关键字具有相同的功能
D. DISTINCT 关键字可以作用于多个字段
2. 操作题
请基于广电用户数据满足以下查询需求:
(1)请统计使用 “互动电视” 及 “数字电视” 两个品牌的用户中,各类用户等级的用户数量,同时统计每类用户等级中用户开户的最早时间。
(2)为对销户用户的情况进行摸底排查,请查询用户状态为 “主动销户” 的用户编号、开户时间、用户等级名称 3 个数据,对最终查询结果按照开户时间进行升序排列,若开户时间相同则按照用户编号进行升序排列。为保证数据分析效率,不需要在查询结果中一次性展示所有数据,只需要展示查询结果中的前 100 条数据。
第五章课后习题
选择题
(1)下列关于 Hive 中取整函数的描述中正确的是( )。
A. FLOOR 函数为向上取整函数,返回值是小于参数值的最大整数
B. CEIL 函数为向上取整函数,返回值是大于参数值的最小整数
C. ROUND 函数为向上取整函数,返回值是大于参数值的最小整数
D. ROUND 函数只能返回整数,不能返回浮点数
(2)以下不是 Hive 中的字符函数的是( )。
A. UPPER
B. LOWER
C. ABS
D. SUBSTR
(3)执行如代码 5-20 所示的语句,得到的结果是( )。
代码 5-20 SUBSTR 函数
SELECT SUBSTR('Hive&HADOOP',2);A. i
B. Hi
C. ive&HADOOP
D. HADOOP
(4)执行如代码 5-21 所示的语句,得到的结果是( )。
代码 5-21 MONTH 函数
SELECT MONTH('2021-02-29');A. 2
B. 3
C. NULL
D. 出现报错
(5)使用下列连接时只会在查询结果中保留符合连接条件的数据的是( )。
A. 左外连接
B. 右外连接
C. 内连接
D. 全外连接
(6)下列关于左半开连接的描述中错误的是( )。
A. 左半开连接可以在 SELECT 关键字后使用右表的字段
B. 使用左半开连接的查询结果中只会包含左表数据
C. 左半开连接只保留能够满足连接条件的数据
D. 左半开连接的效率要高于内连接
(7)numbers 表一共有 10 个桶,执行如代码 5-22 所示的语句,抽取的桶的情况为( )。
代码 5-22 抽样查询
SELECT * FROM numbers
TABLESAMPLE (BUCKET 2 OUT OF 5 ON id);A. 1 3 5 7 9
B. 2 7
C. 2 4 6 8 10
D. 2 4
操作题
基于广电用户数据请完成以下统计任务。
(1)订单数据表 order_index 使用 orderdate字段记录产品订购时间,使用 effdate 字段记录产品生效时间,使用 expdate 字段记录产品失效时间。请统计 order_index表中每笔订单从产品订购到产品生效的间隔时间,以及产品生效至产品失效的间隔时间,以此来观察是否能在用户订购产品之后及时为用户开通产品,产品一般使用时长为多久。
(2)账单数据表 mmconsume_billevents 使用 should_pay 字段记录每笔账单的应收金额,然后使用 favour_fee 字段记录每笔账单的优惠金额,favour_fee 字段值为正数代表优惠,为负数代表产生额外费用。假如 2022 年 7 月有一个促销活动,对于开户时间超过 3 年,不存在暂停、欠费等异常情况的用户,每笔账单的实付金额将打 9 折。请计算 2022 年 7 月的所有账单最终实付金额。
第六章 广电用户收视行为数据查询优化
一、选择题
(1) 下列关于创建 Hive 视图的语法中的参数的描述中错误的是()
A. IF NOT EXISTS 参数,用于判断是否存在同名的视图
B. COMMENT 参数,只能用于为选择的数据字段添加注释
C. TBLPROPERTIES 参数,用于创建视图时添加自定义或预定义的数据属性
D. AS SELECT 参数,用于选择所基于的基本表内容创建视图
(2) 下列选项中,能够查看当前数据库中视图的命令是()。
A. SHOW VIEW;
B. DESC VIEWS;
C. SHOW VIEWS;
D. SHOW TABLE;
(3) 关于 Fetch 抓取的配置,下列说法中正确的是()。
A. 当 hive.fetch.task.conversion 参数的值设置为 none 时,所有查询都会运行 MapReduce
B. 当 hive.fetch.task.conversion 参数的值设置为 more 时,所有查询都不会运行 MapReduce
C. 当 hive.fetch.task.conversion 参数的值设置为 minimal 时,所有查询都会运行 MapReduce
D. 以上选项都错误
(4) 在下列选项中,Hive 3.1.2 默认开启的配置是()。
A. 在使用 GROUP BY 语句时,允许在发生数据倾斜时进行负载均衡
B. 允许在 Map 阶段进行聚合
C. 允许任务并行执行
D. 在使用 ORDER BY 语句进行查询时必须使用 LIMIT 语句
(5) 在 Hive 3.1.2 中,可通过设置()参数值以增加或减少 map 任务数。
A. hive.map.aggr
B. hive.exec.parallel.thread.number
C. hive.exec.reducers.bytes.per.reducer
D. mapreduce.input.fileinputformat.split.maxsize
二、操作题
随着经济的发展,交通越来越发达,人们的出行意愿也越来越强烈。火车兼具便捷与价格相对较低的特点,是居民长途旅行主要的交通工具。铁路部门工作人员针对某些铁路站点记录了各列车上下乘客的数量,得到铁路站点客流量数据文件train.csv。
字段清单
| 字段 | 描述 |
|---|---|
| station | 铁路站点编号 |
| on_num | 上车人数 |
| on_time | 上车时间 |
| off_num | 下车人数 |
| off_time | 下次时间 |
| record_time | 记录日期:年月日 |
| train_number | 列车编号 |
随着选择火车出行的人越来越多,某些铁路站点出现了 “一票难求” 的购票局面,因此需要对铁路站点的客流量进行统计分析,完成以下要求。
(1) 使用 Hive 根据数据字段创建表,并导入数据。
(2) 创建视图,筛选合适字段,优化 Hive 配置环境,统计出每个站点的总客流量。
(3) 使用子查询统计出平均上车乘客数量大于 1000 的站点。
-- ====================== 1. 创建表并导入数据 ======================
-- 切换并确保使用正确的数据库(根据机考规范建议加上)
-- CREATE DATABASE IF NOT EXISTS train_db;
-- USE train_db;
DROP TABLE IF EXISTS train;
CREATE TABLE IF NOT EXISTS train (
station STRING COMMENT '铁路站点编号',
on_num INT COMMENT '上车人数',
on_time STRING COMMENT '上车时间',
off_num INT COMMENT '下车人数',
off_time STRING COMMENT '下车时间', -- 修正了原注释中的笔误'下次时间'
record_time STRING COMMENT '记录日期:年月日',
train_number STRING COMMENT '列车编号'
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
COMMENT '铁路站点客流量原始数据表';
-- 导入数据(先执行Linux命令删除表头:sed -i '1d' /opt/train.csv)
-- 使用 OVERWRITE 替代 TRUNCATE,更具备兼容性和数仓幂等性规范
LOAD DATA LOCAL INPATH '/opt/train.csv' OVERWRITE INTO TABLE train;
-- 验证数据导入
SELECT * FROM train LIMIT 5;
-- ====================== 2. 创建视图并统计总客流量 ======================
-- 步骤 1:全量优化配置环境
SET hive.cli.print.header = true; -- 开启列名显示
SET hive.resultset.use.unique.column.names=false; -- 过滤表名前缀
SET hive.cli.print.current.db = true; -- 提示符显示当前数据库
SET hive.fetch.task.conversion = more; -- 开启快速 Fetch 抓取
SET hive.exec.parallel = true; -- 开启阶段并行执行
SET hive.map.aggr = true; -- 开启 Map 端预聚合
SET hive.groupby.skewindata = true; -- 开启数据倾斜负载均衡
-- 步骤 2:创建视图,筛选分析所需的合适字段,拒绝全表扫描,提升性能
CREATE VIEW IF NOT EXISTS v_station_traffic
COMMENT '站点客流量统计视图'
AS
SELECT station, on_num, off_num
FROM train;
-- 基于视图统计每个站点的总客流量
SELECT
station,
SUM(COALESCE(on_num, 0) + COALESCE(off_num, 0)) AS total_passengers
FROM v_station_traffic
GROUP BY station
ORDER BY total_passengers DESC;
-- ====================== 3. 统计平均上车人数大于1000的站点 ======================
-- 步骤 3:严格遵循题目硬性指标,使用【子查询】进行嵌套统计
SELECT station, avg_on_num
FROM (
SELECT
station,
AVG(COALESCE(on_num, 0)) AS avg_on_num
FROM train
GROUP BY station
) subquery
WHERE avg_on_num > 1000
ORDER BY avg_on_num DESC;第七章 广电用户数据清洗及数据导出
一、选择题
(1) 下列关于使用 INSERT OVERWRITE 语句实现将 Hive 数据导出的语法中的参数的描述中错误的是()。
A. DIRECTORY,在参数后指定数据导出的目录
B. SELECT ... FROM ...,用于选择存储内容
C. STORED AS,用于指定文件存储格式
D. ROW FORMAT,用于设置行距
(2) 下列选项中,不属于低质量数据特征的是()。
A. 不完整性 B. 不一致性 C. 无效性 D. 合理性
(3) Hive 中存在一张 student 表,表中存在两个字段,分别为学生姓名 name 和学生编号 id,存在一个学生姓名对应多个学生编号的情况,下列选项中,能够实现统计重复的学生姓名的是()。
A. SELECT name,COUNT(1) AS nums FROM student GROUP BY name HAVING nums > 1;
B. SELECT name FROM student WHERE name > 1;
C. SELECT COUNT(name) AS nums FROM student WHERE nums > 1;
D. SELECT name,COUNT(1) AS nums FROM student GROUP BY id HAVING nums > 1;
(4) Hive 中存在一张 teacher 表,表中存在两个数据字段,分别为老师姓名 name 和授课科目 class,下列选项中,能够实现删除授课科目为语文的数据的是()。
A. DROP TABLE teacher WHERE class = '语文';
B. CREATE TABLE teacher_clean IF NOT EXISTS AS SELECT * FROM teacher WHERE class NOT IN ('语文');
C. ALTER TABLE teacher IF class = '语文';
D. SET TABLE teacher WHERE class NOT IN ('语文');
(5) 使用 INSERT OVERWRITE 语句实现将 Hive 数据导出至 Linux 本地目录,下列选项中使用的导出目录参数正确的是()
A. DIRECTORY
B. LOCAL DIRECTORY
C. HDFS DIRECTORY
D. Linux DIRECTORY
二、操作题
居民在使用家用热水器的过程中,由于区域不同和年龄、性别差异等原因,形成了不同的使用习惯。国内某热水器生产厂商新研发的一种高端智能热水器,在状态发生改变或在流水状态时,会采集各项数据,记录各种不同的用水事件。该厂商通过收集各用户的热水器使用数据得到用户数据文件heater.csv。
字段清单
| 字段 | 描述 |
|---|---|
| Id | 热水器编号 |
| Occurrence_time | 发生时间 |
| State | 开关机状态 |
| Heating | 加热中 |
| Insulation | 保温中 |
| Flow | 有无水流 |
| Actual_temperature | 实际温度 |
| Hot_water | 热水量 |
| Discharge | 水流量 |
| Energy_Mode | 节能模式 |
| Heating_remaining_time | 加热剩余时间 |
| Current_tmp | 当前设置温度 |
厂商需要根据用户数据进行用户行为分析,但原始数据中存在大量不合理数据,因此需要进行数据清洗。数据清洗要求如下:
(1) 因为研究的是用户行为,所以需要删除热水器编号字段 Id。
(2) 因为有无水流字段 Flow 可以通过水流量字段 Discharge 反馈,所以需要删除有无水流字段 Flow。
(3) 探索节能模式字段 Energy_Mode,若值都为关,则可删除该字段。
(4) 删除开关机状态字段 State 值为关且水流量字段 Discharge 值为 0 的数据。
(5) 将删除后的结果保存至 Linux 本地/opt/heater目录下。
1. 创建表与数据导入(引入外部表更规范)
-- 推荐创建外部表(EXTERNAL),安全规范
CREATE EXTERNAL TABLE IF NOT EXISTS heater (
Id STRING,
Occurrence_time STRING,
State STRING,
Heating STRING,
Insulation STRING,
Flow STRING,
Actual_temperature STRING,
Hot_water STRING,
Discharge INT,
Energy_Mode STRING,
Heating_remaining_time STRING,
Current_tmp STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
-- 执行 “sed -i '1d' /opt/heater.csv” 删除文件首行表头
-- 数据导入(建议加上 OVERWRITE 覆盖写入,防止重复执行脚本导致数据翻倍)
LOAD DATA LOCAL INPATH '/opt/heater.csv' OVERWRITE INTO TABLE heater;2. 探索节能模式字段
SELECT Energy_Mode, COUNT(*) FROM heater GROUP BY Energy_Mode;
-- 运行结果全为“关”,验证了第(3)步可以删掉该列3. 数据清洗 (ETL)(核心修正点)
CREATE TABLE IF NOT EXISTS heater_clean
COMMENT '用户热水器行为清洗表'
AS
SELECT
Occurrence_time,
State,
Heating,
Insulation,
Actual_temperature,
Hot_water,
Discharge,
Heating_remaining_time,
Current_tmp
FROM heater
-- 正确过滤逻辑:剔除 State='关' 且 Discharge=0 的记录 或者WHERE State != '关' OR Discharge != 0
WHERE NOT (State = '关' AND Discharge = 0);4. 验证清洗是否成功
-- 验证:查询清洗后的表里是否还存在同时为 关 和 0 的数据
SELECT COUNT(*) FROM heater_clean WHERE State = '关' AND Discharge = 0;
-- 输出为 0 证明清洗完全成功5. 数据导出与下发(工程修正点)
# 【必须先在 Linux 终端窗口执行】创建导出目标目录
mkdir -p /opt/heater-- 【然后再在 Hive 窗口执行】数据导出
INSERT OVERWRITE LOCAL DIRECTORY '/opt/heater'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
SELECT * FROM heater_clean;6. 查看导出的数据
# 在 Linux 终端执行验证
cat /opt/heater/000000_0 | head -n 10优化:
-- ====================== 1. 创建原始数据表 ======================
DROP TABLE IF EXISTS heater;
CREATE TABLE IF NOT EXISTS heater (
Id STRING COMMENT '热水器编号',
Occurrence_time STRING COMMENT '发生时间',
State STRING COMMENT '开关机状态',
Heating STRING COMMENT '加热中',
Insulation STRING COMMENT '保温中',
Flow STRING COMMENT '有无水流',
Actual_temperature DOUBLE COMMENT '实际温度',
Hot_water INT COMMENT '热水量',
Discharge INT COMMENT '水流量',
Energy_Mode STRING COMMENT '节能模式',
Heating_remaining_time INT COMMENT '加热剩余时间',
Current_tmp DOUBLE COMMENT '当前设置温度'
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
COMMENT '热水器原始数据表';
-- ====================== 2. 导入数据 ======================
-- 先执行Linux命令删除表头:sed -i '1d' /opt/heater.csv
-- 使用 OVERWRITE 实现幂等性,安全清空并导入,完全兼容内/外部表
LOAD DATA LOCAL INPATH '/opt/heater.csv' OVERWRITE INTO TABLE heater;
-- ====================== 3. 探索节能模式字段 ======================
-- 启用 CLI 打印配置,优化阅卷/看结果的体验
SET hive.cli.print.header = true;
SET hive.resultset.use.unique.column.names = false;
SELECT Energy_Mode, COUNT(*) AS `记录数`
FROM heater
GROUP BY Energy_Mode
WITH ROLLUP; -- 包含总计,极佳的数据探索习惯
-- ====================== 4. 数据清洗(核心修正) ======================
DROP TABLE IF EXISTS heater_clean;
CREATE TABLE heater_clean
COMMENT '热水器清洗后数据表'
AS
SELECT
Occurrence_time,
State,
Heating,
Insulation,
Actual_temperature,
Hot_water,
Discharge,
Heating_remaining_time,
Current_tmp
FROM heater
WHERE NOT (State = '关' AND Discharge = 0); -- 逻辑完美无误
-- ====================== 5. 验证清洗结果 ======================
-- 验证1:无符合删除条件的记录
SELECT COUNT(*) AS `残留脏数据条数` FROM heater_clean WHERE State = '关' AND Discharge = 0;
-- 验证2:记录数对比(采用标准数仓对齐写法,100% 兼容所有 Hive 版本)
SELECT
a.raw_cnt AS `原始记录数`,
b.clean_cnt AS `清洗后记录数`,
(a.raw_cnt - b.clean_cnt) AS `已删除记录数`
FROM
(SELECT COUNT(*) AS raw_cnt FROM heater) a
CROSS JOIN
(SELECT COUNT(*) AS clean_cnt FROM heater_clean) b;
-- ====================== 6. 导出清洗后数据 ======================
-- 无需提前通过 shell 强删目录(避免 root 权限报错)。
-- Hive 的 INSERT OVERWRITE 会完全接管本地目录的创建与旧数据覆盖清空。
INSERT OVERWRITE LOCAL DIRECTORY '/opt/heater'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
NULL DEFINED AS '' -- 极佳的企业级数仓规范:防止 NULL 变成字符串 '\N' 导出
SELECT * FROM heater_clean;
-- 查看导出结果
! cat /opt/heater/000000_0 | head -n 10;第 8 章 广电用户数据存储与处理的程序开发
1. 选择题
(1)【多选】下列关于 IDEA 项目初始框架的描述中,正确的有()。
A. .idea 节点:主要用于保存 IDEA 项目的相关信息
B. src 节点:用于保存源代码(main 目录)和测试代码(test 目录)
C. External Libraries 节点:用于保存使用的外部库文件链接
D. Scratches and Consoles:可提供两种临时的文件编辑环境,通过这两种临时的文件编辑环境,用户可以写一些文本内容或一些代码片段
(2) 下列关于 HiveServer 的描述中,不正确的是()。
A. HiveServer 和 HiveServer2 的功能差不多
B. 在早期版本中,由于 HiveServer 使用的 Thrift 接口的限制,HiveServer 不能处理多个客户端的并发请求可能导致的数据不一致问题
C. Hive 0.11.0 重写了 HiveServer 代码(称为 HiveServer2),以解决多用户并发访问问题
D. HiveServer2 支持多客户端的并发和认证,为客户端通过 API (JDBC、ODBC 等) 访问 Hive 提供更好的支持
(3)【多选】下列关于 JDBC 接口的描述中,正确的有()。
A. Driver 接口是所有 JDBC 驱动必须实现的接口,该接口专门提供给数据库厂商使用
B. DriverManager 接口是 JDBC 提供的工具类,用于加载 JDBC 驱动、创建与数据库的连接
C. Connection 的主要作用是与特定数据库进行连接,在连接上下文中执行 SQL 语句并返回结果
D. PreparedStatement 表示预编译的 SQL 语句的对象,是 Statement 的子接口,该接口扩展了带有参数 SQL 语句的执行操作
(4) 下列关于 JDBC 的描述中,不正确的是()。
A. JDBC 是一种用于执行 SQL 语句的 Java API
B. 可以为不同数据库提供统一的、面向 Java 的访问接口
C. Hive-JDBC 是专用于 Hive 的 JDBC 驱动
D. JDBC 连接数据库时通常需要提供 JDBC 驱动的类名这 1 个必要参数
(5)【多选】下列关于 Hive 程序调试的描述中,正确的有()。
A. 在 IDEA 程序编辑环境下,可单击行号右边空白处,在相应的代码前面设置断点
B. 在调试模式下,程序遇到断点会自动中断运行
C. 程序在中断情况下,可通过切换到 “Debugger” 窗口,实时查看变量值
D. 调试程序的快捷键为 Shift+F9
2. 操作题
基于第 7 章课后习题中的操作题,在 IDEA 中使用程序的方式实现以下热水器用户数据清洗的操作。
(1)删除热水器编号字段 Id。
(2)删除有无水流字段 Flow。
(3)删除开关机状态字段 State 为关且水流量字段 Discharge 为 0 的数据。