Skip to content

第 3 章 广电用户数据存储 ​

开篇 ​

本章是 Hive 广电大数据分析的地基篇,后续所有的用户收视行为分析、消费统计、流失预警、价值分层,都必须先把业务数据规范地存储到 Hive 中。

学完本章,你能独立完成 4 件核心事:

  1. Hive 数据库的创建、切换、修改、删除全流程操作
  2. 给业务字段选对 Hive 数据类型,避开新手最容易踩的类型坑
  3. 分清 5 种 Hive 表的区别,知道什么业务场景用什么表
  4. 把 CSV 格式的广电原始业务数据,完整、正确地导入 Hive 表,为后续分析铺路

前置准备:已搭建好 Hadoop+Hive 运行环境,能正常进入 Hive CLI/Beeline 客户端,已拿到配套的广电业务 CSV 数据文件。


一、第一步:先搞懂 Hive 数据库(先建库,再建表) ​

1. 大白话理解 Hive 数据库 ​

Hive 数据库本质上就是HDFS 上的一个文件夹 / 命名空间,作用是把不同业务的表做逻辑分组,避免表名冲突。

  • 比如我们把广电所有的业务表,都放在ZJSM这个库里,和其他业务的表彻底分开
  • Hive 默认自带一个default数据库,不指定库时,所有表都会建在这里,不建议生产使用
  • 每个数据库在 HDFS 上对应一个文件夹,命名规则是库名.db,默认路径是/user/hive/warehouse/库名.db

2. 数据库核心操作(理论 + 案例) ​

所有操作代码,都可以直接复制到 Hive 客户端执行。

(1)创建数据库 ​

核心语法:

hive
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] 数据库名
[COMMENT '数据库注释']
[LOCATION 'HDFS自定义路径']
[WITH DBPROPERTIES (属性名=属性值, ...)];
  • 关键字说明(新手必记):

    • DATABASE|SCHEMA:两者功能完全一样,统一用DATABASE即可
    • IF NOT EXISTS:必加,避免数据库已存在时抛出异常,让脚本更健壮
    • COMMENT:给数据库加业务注释,告诉别人这个库是干嘛的
    • LOCATION:自定义数据库在 HDFS 上的存储路径,不写就用默认路径
    • WITH DBPROPERTIES:给数据库加自定义属性,比如创建人、创建时间、业务线

入门案例 1:创建测试库 TestDB

hive
-- 创建测试库,加IF NOT EXISTS避免报错
CREATE DATABASE IF NOT EXISTS TestDB
COMMENT 'Hive入门测试库'
WITH DBPROPERTIES (
    'creator' = '新手入门',
    'create_time' = '2024-01-01'
);

-- 查看所有数据库,验证是否创建成功
SHOW DATABASES;

入门案例 2:创建广电业务专属库 ZJSM

hive
-- 创建广电用户分析专属业务库
CREATE DATABASE IF NOT EXISTS ZJSM
COMMENT '广电用户行为分析数仓'
WITH DBPROPERTIES ('business' = '广电用户收视、账单、订单数据存储');

-- 验证创建结果
SHOW DATABASES;

(2)切换与查看当前数据库 ​

hive
-- 切换到指定数据库,相当于Windows里打开文件夹
USE ZJSM;
-- 切换回默认库
USE DEFAULT;

-- 开启提示符显示当前数据库(新手必开,避免建表建错库)
SET hive.cli.print.current.db=true;

开启后,Hive 提示符会变成hive (zjsm)>,一眼就能看到当前在哪个库,再也不会建错表。

(3)修改数据库属性 ​

只能修改数据库的自定义属性,不能修改库名、不能修改默认存储路径

hive
-- 修改数据库的自定义属性
ALTER DATABASE ZJSM SET DBPROPERTIES ('update_time' = '2024-01-02');

(4)删除数据库 ​

核心语法:

hive
DROP DATABASE [IF EXISTS] 数据库名 [RESTRICT|CASCADE];
  • RESTRICT:默认值,数据库里有表时,禁止删除(防止误删)
  • CASCADE:强制级联删除,会把库里的所有表一起删掉,新手慎用

案例:

hive
-- 安全删除空数据库
DROP DATABASE IF EXISTS TestDB;
-- 强制删除带表的数据库(仅测试用,生产禁止)
DROP DATABASE IF EXISTS TestDB CASCADE;

二、第二步:搞懂 Hive 数据类型(建表前必学,避坑核心) ​

建表的核心就是给每个字段选对数据类型,Hive 数据类型分为基础数据类型和复合数据类型两大类,新手先抓高频常用的,不用死记所有。

1. 基础数据类型(新手高频使用) ​

表格

类型分类类型名大白话解释广电业务适用场景新手避坑提示
字符串类型STRING字符串,不限长度,最常用的类型用户编号、地址、名称、时间、状态、编号等所有文本类数据新手优先用 STRING,尤其是日期、编号,避免格式不匹配导致解析失败
整型INT4 字节整数,范围 - 21 亿~21 亿观看时长、进程 ID、数量等整数数据数值不大用 INT 就行,超大数值用BIGINT
整型BIGINT8 字节大整数,范围极大毫秒级观看时长、超大统计数值
高精度数值DECIMAL(总位数,小数位数)高精度小数,无精度丢失账单金额、订单金额、优惠金额金额类必须用 DECIMAL,禁止用 FLOAT/DOUBLE,避免金额计算精度丢失
浮点型DOUBLE双精度浮点数,有轻微精度丢失比率、平均值等非金额类小数绝对不能用来存金额
布尔类型BOOLEAN真 / 假(true/false)是否生效、是否销户等二值状态
日期类型DATE日期,格式 YYYY-MM-DD开户日期、账单日期格式不标准的日期,先用 STRING 存储,后续清洗再转换

2. 复合数据类型(突破传统数据库限制) ​

和 MySQL 等关系型数据库不同,Hive 支持复合数据类型,一个字段里可以存一组数据,不用拆成多个表,非常适合存储结构化的复杂数据。

(1)数组类型 ARRAY<元素类型> ​

  • 大白话:一组类型完全相同的数据,有序排列,索引从 0 开始

  • 广电场景:用户的标签列表、点播节目分类列表

  • 入门案例:

    hive
    -- 定义一个字符串数组,存用户的下属列表
    subordinates ARRAY<STRING>
    -- 数据示例:['张三','李四','王五']
    -- 访问方式:subordinates[0] → 取第一个元素'张三'

(2)映射类型 MAP<键类型, 值类型> ​

  • 大白话:一组键值对,键必须是基础类型,值可以是任意类型,类似 Python 的字典

  • 广电场景:用户的扣款项目明细、节目扩展属性

  • 入门案例:

    hive
    -- 定义一个字符串键、浮点型值的MAP,存用户扣款项目
    deductions MAP<STRING, FLOAT>
    -- 数据示例:{'社保':200,'个税':100,'公积金':300}
    -- 访问方式:deductions['社保'] → 取对应的值200

(3)结构体类型 STRUCT<字段名:类型, 字段名:类型,...> ​

  • 大白话:把一组不同类型的字段打包成一个对象,类似 Java 的类、Python 的对象

  • 广电场景:点播节目分类层级、用户地址结构化数据

  • 入门案例:

    hive
    -- 定义一个结构体,存节目分类层级
    vod_cat STRUCT<level1:STRING, level2:STRING, level3:STRING>
    -- 数据示例:{'电影','国产电影','动作片'}
    -- 访问方式:vod_cat.level1 → 取一级分类'电影'

三、第三步:Hive 5 种表类型全解(建表核心) ​

Hive 有 5 种核心表类型,分别是内部表、外部表、分区表、桶表、临时表,每种表的生命周期、存储逻辑、适用场景都不同,新手必须先分清区别,再建表。

通用建表语法(新手必背) ​

hive
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [库名.]表名(
    字段名1 数据类型 [COMMENT '字段注释'],
    字段名2 数据类型 [COMMENT '字段注释'],
    ...
)
[COMMENT '表的注释']
[PARTITIONED BY (分区字段名 数据类型 [COMMENT '分区注释'], ...)]
[CLUSTERED BY (分桶字段名) [SORTED BY (排序字段 排序规则)] INTO 桶数量 BUCKETS]
[ROW FORMAT DELIMITED FIELDS TERMINATED BY '字段分隔符']
[STORED AS 文件格式]
[LOCATION 'HDFS存储路径'];

新手核心关键字说明:

  • IF NOT EXISTS:必加,避免表已存在时报错
  • EXTERNAL:加了就是外部表,不加就是默认的内部表
  • ROW FORMAT DELIMITED FIELDS TERMINATED BY ';':核心中的核心,指定表的字段分隔符,必须和 CSV 文件的分隔符完全一致,否则数据会全错
  • STORED AS TEXTFILE:文件格式,纯文本 CSV 文件用 TEXTFILE 即可

1. 内部表(管理表) ​

大白话定义 ​

Hive 默认的表类型,Hive 完全管理这个表的元数据和数据文件,删表的时候,表的元数据和 HDFS 上的实际数据会一起被删掉。

核心特性 ​

  • 数据默认存在 Hive 仓库路径/user/hive/warehouse/库名.db/表名/
  • 删除表 = 彻底删除数据,无法恢复

适用场景 ​

  • 中间计算结果表、临时统计结果表、维度表
  • 数据可以通过原始数据重新生成的场景

入门创建案例 ​

hive
-- 代码3-2 创建员工内部表
CREATE TABLE IF NOT EXISTS TestDB.employees(
    name STRING COMMENT '员工姓名',
    age INT COMMENT '年龄',
    salary FLOAT COMMENT '工资',
    department STRING COMMENT '所属部门',
    subordinates ARRAY<STRING> COMMENT '下属姓名列表',
    deductions MAP<STRING, FLOAT> COMMENT '扣款项目明细'
)
COMMENT '员工信息内部表';

-- 查看表结构,验证创建结果
DESCRIBE TestDB.employees;

2. 外部表(新手保护原始数据必用) ​

大白话定义 ​

Hive 只和 HDFS 上的数据文件建立映射关系,只管理元数据,不管理实际数据。删表的时候,只会删除元数据,HDFS 上的原始数据会完整保留,不会被删掉。

核心特性 ​

  • 创建时可以通过LOCATION指定原始数据在 HDFS 上的路径
  • 删除表 = 只删映射关系,原始数据丝毫不损,再也不怕误删数据

适用场景 ​

  • 原始业务数据、CSV 源文件、多表共享的基础数据
  • 广电用户、账单、订单、收视行为这些不可再生的原始数据,必须用外部表

入门创建案例 ​

hive
-- 代码3-3 创建员工外部表
CREATE EXTERNAL TABLE IF NOT EXISTS TestDB.employees_external(
    name STRING COMMENT '员工姓名',
    age INT COMMENT '年龄',
    salary FLOAT COMMENT '工资',
    department STRING COMMENT '所属部门',
    subordinates ARRAY<STRING> COMMENT '下属姓名列表',
    deductions MAP<STRING, FLOAT> COMMENT '扣款项目明细'
)
COMMENT '员工信息外部表'
LOCATION '/ext/'; -- 指定数据在HDFS上的存储路径

3. 分区表(大数据查询优化神器) ​

大白话定义 ​

把表的数据按分区字段,分成不同的子文件夹存储。查询的时候,只需要扫描指定分区的文件夹,不用扫全表,查询速度能提升几十上百倍。

核心特性 ​

  • 分区字段是虚拟字段,不会存在数据文件里,仅用来做文件夹分类
  • 最常用的分区是按日期分区,比如年、月、日
  • 分为静态分区(分区值手动指定)和动态分区(分区值由数据自动生成)

适用场景 ​

  • 超大数据量表、按时间 / 地区 / 品牌高频过滤的场景
  • 广电账单表按年月分区、收视行为表按日期分区

入门创建案例 ​

hive
-- 代码3-4 创建静态分区表,按国家、省份分区
CREATE TABLE IF NOT EXISTS TestDB.employees_partition(
    name STRING COMMENT '员工姓名',
    age INT COMMENT '年龄',
    salary FLOAT COMMENT '工资',
    department STRING COMMENT '所属部门',
    subordinates ARRAY<STRING> COMMENT '下属姓名列表',
    deductions MAP<STRING, FLOAT> COMMENT '扣款项目明细'
)
COMMENT '员工分区表'
-- 分区字段,不能和表内字段重复
PARTITIONED BY (country STRING, state STRING);

动态分区必备配置 ​

hive
-- 代码3-5 开启动态分区
SET hive.exec.dynamic.partition=true; -- 开启动态分区
SET hive.exec.dynamic.partition.mode=nostrict; -- 非严格模式,允许全动态分区

4. 桶表(解决数据倾斜 + 抽样神器) ​

大白话定义 ​

比分区更细粒度的数据划分,把数据按指定字段哈希取模,均匀分到固定数量的「桶」文件里。解决数据倾斜问题,同时大幅提升抽样、大表 JOIN 的效率。

核心特性 ​

  • 分桶字段必须是表内已有的字段
  • 数据按哈希取模均匀分发,避免数据集中在少数文件里
  • 桶的数量固定,创建表时指定

适用场景 ​

  • 大表 JOIN 优化、高频数据抽样、解决数据倾斜
  • 广电千万级订单表、收视行为表按用户编号分桶

入门创建案例 ​

hive
-- 代码3-6 创建桶表,按部门分3个桶,每个桶内按年龄降序排列
CREATE TABLE IF NOT EXISTS TestDB.employees_cluster(
    name STRING COMMENT '员工姓名',
    age INT COMMENT '年龄',
    salary FLOAT COMMENT '工资',
    department STRING COMMENT '所属部门',
    subordinates ARRAY<STRING> COMMENT '下属姓名列表',
    deductions MAP<STRING, FLOAT> COMMENT '扣款项目明细'
)
COMMENT '员工桶表'
-- 按部门分3个桶,每个桶内按年龄降序排序
CLUSTERED BY (department) SORTED BY (age DESC) INTO 3 BUCKETS;

5. 临时表 ​

大白话定义 ​

只对当前 Hive 会话可见的表,会话结束后,表和数据会被 Hive 自动删除,不用手动清理。

核心特性 ​

  • 数据存在 Hive 临时目录,会话退出自动删除
  • 不支持分区、不支持创建索引
  • 同库内临时表和永久表重名时,只会访问临时表

适用场景 ​

  • 复杂查询的中间结果、单次会话的临时计算、测试用表

入门创建案例 ​

hive
-- 代码3-7 创建临时表
CREATE TEMPORARY TABLE TestDB.Course_Temp(
    id INT,
    course STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS textfile;

四、第四步:数据导入 Hive 表(LOAD 语句全解) ​

表建好了,接下来就是把 CSV 里的业务数据导入 Hive 表,核心用LOAD DATA语句。

1. LOAD 核心语法 ​

hive
LOAD DATA [LOCAL] INPATH '文件路径'
[OVERWRITE] INTO TABLE 表名
[PARTITION (分区字段=值, ...)];

新手必懂关键字:

表格

关键字核心作用新手避坑
LOCAL加了 = 从 Linux 本地文件系统导入;不加 = 从 HDFS 导入本地 CSV 文件导入必须加 LOCAL,否则会去 HDFS 找文件,直接报错
OVERWRITE加了 = 覆盖表中原有数据;不加 = 在原有数据后追加首次导入建议加,避免重复执行导致数据重复
PARTITION分区表导入时,必须指定分区字段和值非分区表不用写

2. 入门完整案例 ​

bash
# 1. Linux终端操作:创建HDFS目录,上传测试文件
hdfs dfs -mkdir /course
# 把本地/opt目录下的course.txt上传到HDFS的/course目录
hdfs dfs -put /opt/course.txt /course/
hive
-- 2. Hive客户端操作:创建表
USE TestDB;
CREATE TABLE IF NOT EXISTS course(
    id INT,
    course STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; -- 和txt文件的逗号分隔符一致

-- 3. 从HDFS导入数据到表中
LOAD DATA INPATH '/course/course.txt' INTO TABLE TestDB.course;

-- 4. 验证数据是否导入成功
SELECT * FROM course LIMIT 5;

3. 新手必看:导入前的 CSV 预处理 ​

CSV 文件的第一行通常是字段名表头,如果直接导入,表头会被当成业务数据存到表里,导致统计结果错误,必须先删除表头!

bash
# Linux终端执行,删除CSV文件的第一行表头
sed -i '1d' /opt/data/mediamatch_usermsg.csv
sed -i '1d' /opt/data/mediamatch_userevent.csv
sed -i '1d' /opt/data/mmconsume_billevents.csv
sed -i '1d' /opt/data/order_index.csv
sed -i '1d' /opt/data/media_index.csv

五、广电业务全流程实战(从 0 到 1 落地) ​

把前面所有知识点串起来,完整实现广电 5 张核心业务表的创建 + 数据导入,所有代码可直接复制执行。

步骤 1:创建并切换到广电业务库 ​

hive
-- 代码3-12 创建广电专属库
CREATE DATABASE IF NOT EXISTS ZJSM
COMMENT '广电用户业务数据仓库';

-- 切换到该库,开启当前库显示
USE ZJSM;
SET hive.cli.print.current.db=true;

步骤 2:创建 5 张广电业务核心表 ​

所有表均用外部表,保护原始 CSV 数据,分隔符和 CSV 文件的分号;完全匹配。

(1)用户基本数据表 mediamatch_usermsg ​

hive
-- 代码3-13 创建用户基本数据表
CREATE EXTERNAL TABLE IF NOT EXISTS mediamatch_usermsg(
    terminal_no STRING COMMENT '用户地址编号',
    phone_no STRING COMMENT '用户编号(核心关联主键)',
    sm_name STRING COMMENT '品牌名称',
    run_name STRING COMMENT '用户状态',
    sm_code STRING COMMENT '品牌编号',
    owner_name STRING COMMENT '用户等级名称',
    owner_code STRING COMMENT '用户等级编号',
    run_time STRING COMMENT '状态变更时间',
    addressoj STRING COMMENT '用户完整地址',
    open_time STRING COMMENT '开户时间',
    force STRING COMMENT '宽带是否生效'
)
COMMENT '广电用户基本信息表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\;'; -- 匹配CSV分号分隔符

(2)用户状态变更数据表 mediamatch_userevent ​

hive
-- 代码3-14 创建用户状态变更表
CREATE EXTERNAL TABLE IF NOT EXISTS mediamatch_userevent(
    phone_no STRING COMMENT '用户编号',
    run_name STRING COMMENT '用户状态',
    run_time STRING COMMENT '状态变更时间',
    owner_name STRING COMMENT '用户等级名称',
    owner_code STRING COMMENT '用户等级编号',
    open_time STRING COMMENT '开户时间',
    sm_name STRING COMMENT '品牌名称'
)
COMMENT '广电用户状态变更表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\;';

(3)账单数据表 mmconsume_billevents ​

hive
-- 代码3-15 创建账单数据表
CREATE EXTERNAL TABLE IF NOT EXISTS mmconsume_billevents(
    terminal_no STRING COMMENT '用户地址编号',
    phone_no STRING COMMENT '用户编号',
    fee_code STRING COMMENT '费用类型',
    year_month STRING COMMENT '账单年月',
    owner_name STRING COMMENT '用户等级名称',
    owner_code STRING COMMENT '用户等级编号',
    sm_name STRING COMMENT '品牌名称',
    should_pay STRING COMMENT '应收金额',
    favour_fee STRING COMMENT '优惠金额'
)
COMMENT '广电用户月度账单表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\;';

(4)订单数据表 order_index ​

hive
-- 代码3-16 创建订单数据表
CREATE EXTERNAL TABLE IF NOT EXISTS order_index(
    phone_no STRING COMMENT '用户编号',
    owner_name STRING COMMENT '用户等级名称',
    optdate STRING COMMENT '产品订购状态更新时间',
    prodname STRING COMMENT '订购产品名称',
    sm_name STRING COMMENT '品牌名称',
    offerid STRING COMMENT '订购套餐编号',
    offername STRING COMMENT '订购套餐名称',
    business_name STRING COMMENT '订购业务状态',
    owner_code STRING COMMENT '用户等级编号',
    prodprcid STRING COMMENT '订购产品编号',
    prodprcname STRING COMMENT '订购产品名称(带价格)',
    effdate STRING COMMENT '产品生效时间',
    expdate STRING COMMENT '产品失效时间',
    orderdate STRING COMMENT '产品订购时间',
    cost STRING COMMENT '订购产品价格',
    mode_time STRING COMMENT '产品主附标识',
    prodstatus STRING COMMENT '订购产品状态',
    run_name STRING COMMENT '用户状态名',
    orderno STRING COMMENT '订单编号',
    offertype STRING COMMENT '订购套餐类型'
)
COMMENT '广电用户产品订单表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\;';

(5)用户收视行为数据表 media_index ​

hive
-- 代码3-17 创建收视行为表,包含复合数据类型
CREATE EXTERNAL TABLE IF NOT EXISTS media_index(
    terminal_no STRING COMMENT '用户地址编号',
    phone_no STRING COMMENT '用户编号',
    duration STRING COMMENT '观看时长(毫秒)',
    station_name STRING COMMENT '直播频道名称',
    origin_time STRING COMMENT '观看开始时间',
    end_time STRING COMMENT '观看结束时间',
    owner_code STRING COMMENT '用户等级编号',
    owner_name STRING COMMENT '用户等级名称',
    -- 复合类型:结构体数组,存点播节目5级分类
    vod_cat_tags ARRAY<STRUCT<level1_name: STRING,level2_name: STRING,level3_name: STRING,level4_name: STRING, level5_name: STRING>>,
    resolution STRING COMMENT '点播节目清晰度',
    audio_lang STRING COMMENT '点播节目语言',
    region STRING COMMENT '节目地区',
    res_name STRING COMMENT '设备名称',
    res_type STRING COMMENT '节目类型(0=直播,1=点播/回看)',
    vod_title STRING COMMENT '点播节目名称',
    category_name STRING COMMENT '节目所属分类',
    program_title STRING COMMENT '直播节目名称',
    sm_name STRING COMMENT '品牌名称'
)
COMMENT '广电用户收视行为表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\;';

步骤 3:CSV 数据预处理(Linux 终端执行) ​

bash
# 进入CSV文件存放目录
cd /opt/data
# 批量删除5个文件的首行表头
sed -i '1d' mediamatch_usermsg.csv
sed -i '1d' mediamatch_userevent.csv
sed -i '1d' mmconsume_billevents.csv
sed -i '1d' order_index.csv
sed -i '1d' media_index.csv

步骤 4:全量数据导入 Hive 表 ​

hive
-- 代码3-20 导入数据到5张表中
LOAD DATA LOCAL INPATH '/opt/data/mediamatch_usermsg.csv' OVERWRITE INTO TABLE mediamatch_usermsg;
LOAD DATA LOCAL INPATH '/opt/data/mediamatch_userevent.csv' OVERWRITE INTO TABLE mediamatch_userevent;
LOAD DATA LOCAL INPATH '/opt/data/mmconsume_billevents.csv' OVERWRITE INTO TABLE mmconsume_billevents;
LOAD DATA LOCAL INPATH '/opt/data/order_index.csv' OVERWRITE INTO TABLE order_index;
LOAD DATA LOCAL INPATH '/opt/data/media_index.csv' OVERWRITE INTO TABLE media_index;

步骤 5:验证数据导入结果 ​

hive
-- 查看账单表前5行数据,验证字段是否正确拆分
SELECT * FROM mmconsume_billevents LIMIT 5;

-- 统计用户基本表的总行数,和CSV文件行数核对,验证数据完整性
SELECT COUNT(*) FROM mediamatch_usermsg;

六、新手高频踩坑指南(避坑必看) ​

坑 1:导入数据后,所有字段都挤在第一列,其他列全是 NULL ​

  • 原因:建表时的FIELDS TERMINATED BY分隔符,和 CSV 文件的实际分隔符不一致
  • 解决:先看 CSV 文件是逗号、分号还是制表符分隔,建表时严格匹配,分号需要加转义符\;

坑 2:查询数据时,第一行是字段名表头 ​

  • 原因:导入前没有删除 CSV 文件的首行表头,表头被当成数据导入了
  • 解决:导入前用sed -i '1d' 文件名删除首行,已经导入的话用DELETE过滤,或者重新导入

坑 3:LOAD DATA 执行报错,提示文件不存在 ​

  • 原因:从本地导入文件,没加LOCAL关键字,Hive 去 HDFS 上找文件了
  • 解决:Linux 本地文件导入必须加LOCAL,HDFS 文件导入不加LOCAL

坑 4:创建分区表报错,提示分区字段重复 ​

  • 原因:分区字段名和表内的普通字段名重复了
  • 解决:分区字段不能和表内字段重名,分区字段是虚拟字段,不用在表内定义

坑 5:删除外部表后,重新建表查不到数据 ​

  • 原因:删除外部表只删了元数据,HDFS 上的原始数据还在,但是新建表的分隔符、字段顺序和原始数据不匹配
  • 解决:新建表的字段顺序、数据类型、分隔符必须和原始数据完全一致,建表后重新执行 LOAD 导入即可

坑 6:桶表抽样查询不到数据,或者数据量不对 ​

  • 原因 1:插入数据前没开启分桶配置SET hive.enforce.bucketing = true;,数据没有真正分桶
  • 解决:插入数据前必须开启分桶配置,确保数据按规则分到桶里
  • 原因 2:抽样的y不是桶表总桶数的倍数 / 因子,或者x大于y
  • 解决:严格匹配桶数,确保y是总桶数的倍数 / 因子,x≤y

七、入门自测题(学完检验成果) ​

题目 1 ​

请创建一个外部表user_test,包含字段:用户编号phone_no(STRING)、用户姓名user_name(STRING)、用户年龄age(INT)、用户地址address(STRING),分隔符为逗号,,表注释为「用户测试表」。

参考答案
hive
CREATE EXTERNAL TABLE IF NOT EXISTS user_test(
    phone_no STRING COMMENT '用户编号',
    user_name STRING COMMENT '用户姓名',
    age INT COMMENT '用户年龄',
    address STRING COMMENT '用户地址'
)
COMMENT '用户测试表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

题目 2 ​

请写出语句,将 Linux 本地/opt/data/user_test.csv文件的数据,覆盖导入到题目 1 创建的user_test表中。

参考答案
hive
LOAD DATA LOCAL INPATH '/opt/data/user_test.csv' OVERWRITE INTO TABLE user_test;

题目 3 ​

请创建一个分区表bill_partition,字段为phone_no(STRING)、should_pay(DECIMAL (10,2)),按year(INT)、month(INT) 分区,分隔符为分号;。

参考答案
hive
CREATE TABLE IF NOT EXISTS bill_partition(
    phone_no STRING COMMENT '用户编号',
    should_pay DECIMAL(10,2) COMMENT '应收金额'
)
COMMENT '账单分区表'
PARTITIONED BY (year INT, month INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\;';

基于 Vite 强力驱动 | 纯静态轻量托管