Hive 文件格式与查询学习笔记

本文基于 Hive 官方文档整理,涵盖 Hive 常见文件格式(TEXTFILE、ORC、PARQUET)以及 Hive 查询(SELECT)的常用语法与案例。 官方文档:

一、Hive 文件格式

STORED AS:指定文件格式。

复制代码
file_format:
  | TEXTFILE    -- (Default, depending on hive.default.fileformat configuration)
  | ORC         -- (Note: Available in Hive 0.11.0 and later)
  | PARQUET     -- (Note: Available in Hive 0.13.0 and later)

1. TEXTFILE

文本文件格式,是 Hive 默认的文件格式。文本文件中的一行内容,对应 Hive 表中的一行记录。 创建车流量表:

复制代码
CREATE TABLE gateway_records_text_file(
  plate_number STRING COMMENT '车牌号',
  gateway_id STRING COMMENT '卡口编号',
  city STRING COMMENT '卡口所在城市',
  car_brand STRING COMMENT '车辆品牌',
  road_id STRING COMMENT '道路编号',
  travel_direction STRING COMMENT '车辆行驶方向'
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

加载数据:

复制代码
hdfs dfs -put gateway_records.txt /user/hive/warehouse/bigdata.db/gateway_records_text_file

查询数据(看查询时间):

复制代码
SELECT
    city,
    COUNT(1)
FROM gateway_records_text_file
GROUP BY city;

Time taken: 26.306 seconds, Fetched: 10 row(s)

2. ORC

列式存储的文件格式,ORC 文件能提高 Hive 读写和处理数据的性能。

复制代码
CREATE TABLE gateway_records_orc(
  plate_number STRING COMMENT '车牌号',
  gateway_id STRING COMMENT '卡口编号',
  city STRING COMMENT '卡口所在城市',
  car_brand STRING COMMENT '车辆品牌',
  road_id STRING COMMENT '道路编号',
  travel_direction STRING COMMENT '车辆行驶方向'
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS ORC;

插入数据:

复制代码
INSERT INTO bigdata.gateway_records_orc
SELECT * FROM bigdata.gateway_records_text_file;

查询数据(看查询时间):

复制代码
SELECT
    city,
    COUNT(1)
FROM gateway_records_orc
GROUP BY city;

Time taken: 16.92 seconds, Fetched: 10 row(s)

3. PARQUET

PARQUET 是 Hadoop 生态中一个通用的文件格式,它是一个列式存储的文件格式。

复制代码
CREATE TABLE gateway_records_parquet(
  plate_number STRING COMMENT '车牌号',
  gateway_id STRING COMMENT '卡口编号',
  city STRING COMMENT '卡口所在城市',
  car_brand STRING COMMENT '车辆品牌',
  road_id STRING COMMENT '道路编号',
  travel_direction STRING COMMENT '车辆行驶方向'
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS PARQUET;

插入数据:

复制代码
INSERT INTO bigdata.gateway_records_parquet
SELECT * FROM bigdata.gateway_records_text_file;

查询数据(看查询时间):

复制代码
SELECT
    city,
    COUNT(1)
FROM gateway_records_parquet
GROUP BY city;

Time taken: 17.208 seconds, Fetched: 10 row(s)

二、Hive 查询

官方文档:Apache Hive : LanguageManual Select

1. 选择语法

复制代码
[WITH CommonTableExpression (, CommonTableExpression)*]    (Note: Only available starting with Hive 0.13.0)
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
  FROM table_reference
  [WHERE where_condition]
  [GROUP BY col_list]
  [ORDER BY col_list]
  [CLUSTER BY col_list
    | [DISTRIBUTE BY col_list] [SORT BY col_list]
  ]
 [LIMIT [offset,] rows]

2. 案例数据准备

复制代码
-- 创建数据库
CREATE DATABASE dm_db;
-- 创建表(部门表)
CREATE TABLE dept(
    deptno INT COMMENT '部门编号',
    dname STRING COMMENT '部门名称',
    loc INT COMMENT '部门位置'
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
-- 创建表(员工表)
CREATE TABLE emp(
    empno INT COMMENT '员工编号',
    ename STRING COMMENT '员工姓名',
    job STRING COMMENT '员工岗位',
    sal DOUBLE COMMENT '员工薪资',
    deptno INT COMMENT '部门编号'
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
-- 加载数据
LOAD DATA LOCAL INPATH '/root/emp.txt' INTO TABLE emp;
LOAD DATA LOCAL INPATH '/root/dept.txt' INTO TABLE dept;

3. 基础查询

复制代码
SELECT * FROM dept;
SELECT * FROM emp;

SELECT
    deptno,
    dname,
    loc
FROM
    dept;

注意:SQL 语言大小写不敏感;SQL 可以写在一行或多行;关键字不能缩写也不能分开;使用缩进可以提高语句的可读性。

取别名 AS
复制代码
SELECT
    deptno,
    dname AS name,
    loc
FROM
    dept;

别名好处:重命名一个列;便于计算;可以区分相同的字段;AS 可以使用空格替代。

LIMIT 语句
复制代码
SELECT
    empno,
    ename,
    job,
    sal,
    deptno
FROM
    emp
LIMIT 2,3;
WHERE 语句

作用:将不满足条件的行进行过滤;WHERE 子句紧随 FROM 子句后面。

复制代码
SELECT
    empno,
    ename,
    job,
    sal,
    deptno
FROM
    emp
WHERE
    sal > 8000;

注意:WHERE 子句后面不能使用字段别名。


4. 运算符与函数

关系运算符函数
复制代码
=、<=>、!=、<>、<、>、>=、<=、a [NOT] BETWEEN b AND c、a IS NULL、a IS NOT NULL、a [NOT] LIKE b、IN(num1,num2)
逻辑运算函数
复制代码
AND、NOT、OR

SELECT
    empno,
    ename,
    job,
    sal,
    deptno
FROM
    emp
WHERE
    sal > 8000 AND deptno = 30;
聚合函数
复制代码
MAX、MIN、SUM、AVG、COUNT(*)、COUNT(1)、COUNT(列)

SELECT COUNT(*) FROM emp;

5. 分组

GROUP BY 语句
复制代码
SELECT
   AVG(sal),
   deptno
FROM emp
GROUP BY
    deptno;
HAVING 语句

HAVING vs WHERE:

  • WHERE 后面不能跟聚合函数,而 HAVING 语句后面可以使用分组聚合函数。

  • HAVING 只用于 GROUP BY 分组统计语句。 例如:求每个部门的平均薪水高于 4000 的部门。

    SELECT
    deptno,
    AVG(sal) AS avg_sal
    FROM
    emp
    GROUP BY deptno
    HAVING avg_sal > 4000;


6. JOIN

Hive 只支持等值连接,不支持非等值连接。

等值 JOIN
复制代码
SELECT
    empno,
    ename,
    dname
FROM
    emp e JOIN dept d
    ON e.deptno = d.deptno;
内连接
复制代码
SELECT
    empno,
    ename,
    dname
FROM
    emp e JOIN dept d
    ON e.deptno = d.deptno;
左外连接

LEFT JOIN:JOIN 操作符左边表中符合 WHERE 子句的所有记录将会被返回。

复制代码
SELECT
    *
FROM emp e
LEFT JOIN dept d
ON e.deptno = d.deptno;
右外连接

RIGHT JOIN:JOIN 操作符右边表中符合 WHERE 子句所有记录将会被返回。

复制代码
SELECT
    *
FROM emp e
RIGHT JOIN dept d
ON e.deptno = d.deptno;
全外连接(满外连接)

MySQL 中不支持,Hive 可以使用。返回所有表中符合 WHERE 语句条件的所有记录,如果任一表的指定字段没有符合条件的值,那么就使用 NULL 值替代。

复制代码
SELECT
    *
FROM emp e
FULL JOIN dept d
ON e.deptno = d.deptno;

7. 排序查询

ORDER BY

(1)全局排序

  • ASC 升序(默认)

  • DESC 降序

    SELECT
    *
    FROM emp
    ORDER BY sal;

SORT BY

(2)每个 reduce 内部排序 SORT BY:对大规模数据集 ORDER BY 效率非常低,在很多情况下并不需要全局排序,此时使用 SORT BY。 SORT BY 为每一个 reduce 产生一个排序文件,每个 reduce 内部进行排序,对全局结果来说就不是排序。

复制代码
SELECT
    *
FROM
    emp
SORT BY deptno DESC;
DISTRIBUTE BY

分区(Distribute by):

复制代码
SELECT
    *
FROM
    emp
DISTRIBUTE BY deptno
SORT BY sal DESC;
CLUSTER BY

分区排序(Cluster by): CLUSTER BY 只能进行升序排序,兼容 DISTRIBUTE BY 和 SORT BY 的功能。

复制代码
SELECT
    *
FROM
    emp
CLUSTER BY deptno;

三、总结

本文整理了 Hive 中常见的文件格式与查询操作,包括:

  • 三种文件格式:TEXTFILE、ORC、PARQUET 的建表、加载与查询性能对比;
  • Hive SELECT 基础语法;
  • 基础查询、别名、LIMIT、WHERE;
  • 关系运算符、逻辑运算符、聚合函数;
  • GROUP BY、HAVING;
  • 等值 JOIN、内连接、左外连接、右外连接、全外连接;
  • ORDER BY、SORT BY、DISTRIBUTE BY、CLUSTER BY 等排序方式。 掌握这些内容后,可以更高效地在 Hive 中建表、选择文件格式并完成常见查询分析。

参考链接:

相关推荐
承渊政道1 小时前
Linux网络学习【UDP Socket编程实战:网络命令与客户端访问Linux验证】
linux·网络·学习·ubuntu·编程实战·udp socket
小O的算法实验室1 小时前
IEEE TEVC,知识与学习驱动人工蜂群算法+家庭医疗护理路径与调度
学习
JWASX1 小时前
go 学习 - prometheus 指标协程池监控
学习·golang·prometheus
weixin_448119941 小时前
Datawhale Easy Data × AI:构建知识与记忆驱动的 Agent笔记3
人工智能·windows·笔记
peter67681 小时前
vue学习小结
前端·vue.js·学习
我命由我123451 小时前
单利计息与复利计息
经验分享·学习·职场和发展·产品运营·求职招聘·职场发展·产品经理
火眼金睛记单词1 小时前
零基础成人重拾英语:第一个月的30天行动地图
前端·经验分享·学习·小程序
ljt27249606612 小时前
Vue笔记(十二)--mitt
前端·笔记
小雪崩16 小时前
嵌入式学习 day61-62:IMX6ULL驱动——系统移植
学习