小菜鸟

java菜鸟号正在起航

Hive 分区信息丢失:HDFS 上传数据后查不到?MSCK REPAIR TABLE 一键修复

在 Hive 分区表的使用中,有一个非常常见的坑:

  1. 你在 HDFS 上手动建了一个分区目录,比如 date=20210415
  2. 把数据文件传进去了
  3. 去 Hive 里 SHOW PARTITIONS,看不到这个分区
  4. SELECT * FROM 表 WHERE date='20210415',也查不到数据

数据明明在 HDFS 上,Hive 就是看不见。

问题现象:数据传上去了,Hive 查不到

假设你有一个分区表 test_partitioned,按 date 分区。

你用 HDFS 命令手动创建了分区目录并上传了数据:

hdfs dfs -mkdir /user/hive/warehouse/study_hive.db/test_partitioned/date=20210415
hdfs dfs -put data.txt /user/hive/warehouse/study_hive.db/test_partitioned/date=20210415/

HDFS 上已经有这个目录了:

hdfs分区文件夹

去 Hive 里查看:

SHOW PARTITIONS test_partitioned;
-- 结果只有 date=20210413 和 date=20210414
-- date=20210415 没出现

hive元数据分区

阅读全文 »

Hive 分区表:把数据按文件夹拆开查,别再全表扫描了

Hive 表里的数据量一大(比如每天几百万条日志),全表扫描就扛不住了——扫一次几分钟甚至十几分钟。

分区表就是干这个的:把数据按某个字段(比如日期)拆成不同文件夹,查询时只扫对应的文件夹,不扫全表。

普通表:
  /warehouse/order_table/
    ├── 所有数据混在一起(扫全表)

分区表:
  /warehouse/order_table/
    ├── date=2026-07-01/
    │   └── 这一天所有数据
    ├── date=2026-07-02/
    │   └── 这一天所有数据
    └── date=2026-07-03/
        └── 这一天所有数据

查询 WHERE date='2026-07-02' 时,只扫 date=2026-07-02 这个文件夹,其他文件夹不碰。

创建分区表

在普通建表语句上加 PARTITIONED BY 就行了。

CREATE TABLE order_partitioned (
  id INT,
  amount DOUBLE
)
PARTITIONED BY (dt STRING COMMENT '日期,格式 yyyy-MM-dd')
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

注意: 分区列 dt 不在表的普通列里,它是独立的”目录层”字段。插入数据时单独指定。

插入数据

方式1:INSERT 语句

阅读全文 »

Hive 查询:基础 SQL 你会,但 ORDER BY 在大数据量下会卡死,得用 SORT BY + DISTRIBUTE BY

Hive 的查询语法跟 MySQL 差不多,SELECTWHEREGROUP BYJOIN 都一样。

但有一个关键区别: Hive 是分布式的,数据散落在多台机器上。ORDER BY 要把所有数据拉到一台机器上排序,数据量大的时候会卡死。

所以 Hive 有一套分布式排序的语法:

关键字 做什么 全局有序吗
ORDER BY 全局排序 是(但慢)
SORT BY 每个 Reducer 内部排序
DISTRIBUTE BY 控制数据分到哪个 Reducer
CLUSTER BY DISTRIBUTE BY + SORT BY(同字段)

基础查询:跟 SQL 一样,快速过

这些语法跟 MySQL 没区别,看一眼就行。

操作 SQL
全表查 SELECT * FROM dept;
查特定列 SELECT deptno, dname FROM dept;
条件过滤 SELECT * FROM emp WHERE sal > 2000;
去重 SELECT DISTINCT deptno FROM emp;
范围 SELECT * FROM emp WHERE sal BETWEEN 1000 AND 3000;
枚举 SELECT * FROM emp WHERE deptno IN (10, 20);
模糊 SELECT * FROM emp WHERE ename LIKE 'A%';
分组聚合 SELECT deptno, AVG(sal) FROM emp GROUP BY deptno;
聚合过滤 SELECT deptno, AVG(sal) FROM emp GROUP BY deptno HAVING AVG(sal) > 2000;
JOIN SELECT * FROM emp e JOIN dept d ON e.deptno = d.deptno;
限制行数 SELECT * FROM emp LIMIT 10;
NULL 判断 SELECT * FROM emp WHERE sal IS NULL;

ORDER BY:全局排序,但大数据量会卡死

ORDER BY 保证全局有序,但代价是所有数据都跑到一个 Reducer 上排序

SELECT ename, sal FROM emp ORDER BY sal DESC;
阅读全文 »

Hive 数据导出:INSERT OVERWRITE、HDFS 下载、Shell 重定向、EXPORT,四种方式怎么选?

往 Hive 外面导数据,有四种方式:

方式 数据去哪 格式可控 含元数据 适用场景
INSERT OVERWRITE LOCAL 本地文件系统 可指定分隔符 不含 导出给 Excel/MySQL 等工具用
INSERT OVERWRITE HDFS HDFS 目录 可指定分隔符 不含 集群内数据共享
Hive Shell 重定向(-e / -f) 本地文件 默认制表符 不含 脚本化导出、定时任务
EXPORT HDFS 目录 固定格式 表迁移、备份恢复

方式1:INSERT OVERWRITE LOCAL——导出到本地,格式可控

这是最常用的导出方式,把查询结果导出到客户端机器的本地目录,可以指定分隔符。

语法:

INSERT OVERWRITE LOCAL DIRECTORY '/本地路径'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'   -- 指定分隔符
SELECT * FROM dept;

实操:

-- 导出到 /tmp/hive_export,用逗号分隔(CSV 格式)
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/hive_export'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
SELECT deptno, dname FROM dept;

验证:

ls /tmp/hive_export/
# 000000_0  ← Hive 生成的文件

cat /tmp/hive_export/000000_0
# 1,财务
# 2,IT

特点:

  • 可以指定分隔符(CSV、TSV、自定义)
  • 导出到运行 Hive 的那台机器上
  • 会触发 MapReduce/Tez 任务(小数据也慢)

什么时候用: 导出结果给 Excel、报表工具、其他系统用。

方式2:INSERT OVERWRITE HDFS——导出到 HDFS,集群内共享

跟方式1一样,只是导出到 HDFS 而不是本地。

语法:

INSERT OVERWRITE DIRECTORY '/hdfs路径'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
SELECT * FROM dept;
阅读全文 »

Hive 数据导入:HDFS 直接传、LOAD DATA、INSERT,三种方式怎么选?

往 Hive 表里导数据,有三种方式:

方式 速度 复杂度 适用场景
HDFS 直接上传 最快 最低 测试数据、临时导入,不关心元数据
LOAD DATA 批量导入原始文件,推荐方式
INSERT 数据需要转换、过滤、聚合后再导入

选型一句话:能直接用文件就 LOAD DATA,文件需要处理就用 INSERT,临时随便测测就用 HDFS 直接传。

方式1:HDFS 直接上传——最快,但元数据不同步

这种方式最简单:找到表在 HDFS 上的目录,把文件丢进去。

步骤:

-- 1. 建表
CREATE TABLE dept (
  deptno INT,
  dname STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

-- 2. 查看表在 HDFS 上的位置
DESC FORMATTED dept;
-- Location: hdfs://localhost:9000/user/hive/warehouse/study_hive.db/dept
# 3. 直接把数据文件传到表的 HDFS 目录
hdfs dfs -put ./dept.txt /user/hive/warehouse/study_hive.db/dept/
阅读全文 »
0%