李翔-大数据技术

Big data technology!

离线分析实验02-Hive仓库设计及数据加载【2026-4-14】

实验一:Hive 明细仓库设计(ODS层)


实验目的

将设备每天产生的原始运行数据存入 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表

实验目标

  1. 掌握历史数据 CSV 文件导入 Hive 的完整流程

  2. 理解 Hive 中 TEXTFILE 表 与 ORC 分区表的区别

  3. 理解 动态分区写入机制

  4. 学会在导入过程中生成派生字段(ts、dt)

  5. 为后续“大屏历史趋势分析”准备基础数据


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 上。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

版权:李翔
备案/许可证编号为:新ICP备2024006115号-1