本文基于 Hive 官方文档整理,涵盖 Hive 常见文件格式(TEXTFILE、ORC、PARQUET)以及 Hive 查询(SELECT)的常用语法与案例。 官方文档:
- 文件格式:Hive DDL 中的
STORED AS- 查询:Apache Hive : LanguageManual 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 查询
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 中建表、选择文件格式并完成常见查询分析。
参考链接:
- Hive 文件格式:Hive DDL 官方文档
- Hive 查询:Apache Hive : LanguageManual Select