实验目的:
将设备每天产生的原始运行数据存入 Hive,构建数据仓库的第一层 —— ODS 层。
6.1 什么是ODS 表?
6.2 创建Hive ODS表(分区表)
1.启动环境
# 启动 Hadoop start-dfs.sh # 在master操作 start-yarn.sh # 在slave1操作 # 启动 Hive 元数据服务 hive --service metastore & # 启动 Hive 客户端 hive
2.创建Hive的库与表
-- 1) 删除数据库 DROP DATABASE IF EXISTS iot cascade; -- 2)创建数据库(不存在则创建) CREATE DATABASE IF NOT EXISTS iot; -- 3)使用数据库 USE iot; -- 4)创建设备状态明细表(ODS层) CREATE TABLE IF NOT EXISTS iot.ods_device_status_di ( event_type STRING, -- 事件类型 device_id STRING, -- 设备ID status INT, -- 在线状态(1=在线,0=离线) temperature DOUBLE, -- 温度 `load` DOUBLE, -- 负载 voltage DOUBLE, -- 电压 event_time STRING, -- 上报时间 ts TIMESTAMP -- 上报时间的时间戳 ) PARTITIONED BY (dt STRING) -- 按天分区(提高查询效率) STORED AS TEXTFILE;
七、实验二:导入历史数据到Hive的ODS表
实验目标
掌握历史数据 CSV 文件导入 Hive 的完整流程
理解 Hive 中 TEXTFILE 表 与 ORC 分区表的区别
理解 动态分区写入机制
学会在导入过程中生成派生字段(ts、dt)
为后续“大屏历史趋势分析”准备基础数据
7.1 创建 CSV 临时表
先导入临时表 → 再通过 INSERT SELECT 完成数据清洗、字段转换和分区生成 → 最终写入 ORC 分区表
-- 1)切换到 iot 数据库 USE iot; -- 2)如果临时表已经存在,则删除(避免重复创建报错) DROP TABLE IF EXISTS iot.ods_device_status_csv_tmp; -- 3)创建 CSV 临时表(用于存放原始文本数据) CREATE TABLE IF NOT EXISTS iot.ods_device_status_csv_tmp ( event_type STRING, device_id STRING, status INT, temperature DOUBLE, `load` DOUBLE, voltage DOUBLE, event_time STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
解释:
ROW FORMAT DELIMITED= 行数据是“分隔格式”的,即一行数据 = 多个字段拼在一起FIELDS TERMINATED BY ','= 字段之间是用“逗号”分隔的这两行的作用:告诉 Hive 按“逗号”把一行数据拆成多个字段。
TEXTFILE= 普通文本格式
7.2 加载 CSV 数据到 Hive 临时表
-- 将master主机下的/opt/datas/路径下的 CSV 文件导入到 Hive 临时表 ods_device_status_csv_tmp 中 LOAD DATA LOCAL INPATH '/opt/datas/device_status_2026_01.csv' INTO TABLE iot.ods_device_status_csv_tmp;
验证
SELECT * FROM iot.ods_device_status_csv_tmp LIMIT 10;
如果看到数据,说明成功。
7.3 把Hive临时表数据写入 Hive ODS 分区
-- 开启 Hive 动态分区功能(允许自动创建分区) SET hive.exec.dynamic.partition=true; -- 设置为非严格模式(允许所有分区字段都动态生成) SET hive.exec.dynamic.partition.mode=nonstrict; -- 将 CSV 临时表中的数据写入 ORC 分区表 -- 使用 INSERT OVERWRITE 表示覆盖写入(重新生成分区数据) INSERT OVERWRITE TABLE iot.ods_device_status_di PARTITION (dt) SELECT event_type, -- 事件类型 device_id, -- 设备ID status, -- 在线状态 temperature, -- 温度 `load`, -- 负载 voltage, -- 电压 event_time, -- 原始字符串时间 -- 将字符串时间转换为时间戳类型(生成 ts 字段) from_unixtime(unix_timestamp(event_time, 'yyyy-MM-dd HH:mm:ss')) AS ts, -- 截取日期部分作为分区字段 dt(格式:yyyy-MM-dd) substr(event_time, 1, 10) AS dt FROM iot.ods_device_status_csv_tmp -- 过滤掉 CSV 文件中的表头行(避免写入错误数据) WHERE event_type <> 'event_type';
7.4 验证导入结果
-- 查看 iot.ods_device_status_di 表中已经存在的所有分区(按 dt 列出) SHOW PARTITIONS iot.ods_device_status_di; -- 随机查看 iot.ods_device_status_di 表中的前 3 条数据,用于快速验证是否成功入库 SELECT * FROM iot.ods_device_status_di LIMIT 3; -- 查看 分区 dt=2026-01-12 中前5条数据 SELECT * FROM iot.ods_device_status_di WHERE dt = '2026-01-12' LIMIT 5; -- 查看 2026-01-12 分区中时间最新的5条数据 SELECT * FROM iot.ods_device_status_di WHERE dt = '2026-01-12' ORDER BY ts DESC LIMIT 5;
7.5 在HDFS中查看数据
Hive 本身不直接存储数据,表的元数据存储在 Metastore 中,实际数据文件存储在 HDFS 上。