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 中建表、选择文件格式并完成常见查询分析。

参考链接:

相关推荐
海鸥-w6 小时前
数据库冗余字段设计笔记
java·数据库·笔记·oracle
滴啦嘟啦哒6 小时前
【具身笔记】【原理探究】一、对PI05源码的实践笔记
笔记·python·vla·具身
程序员梅雨7 小时前
【从零开始学习数据仓库 | 第一篇】:维度建模理论
大数据·数据仓库·学习·阿里云·数据分析
keyipatience8 小时前
Git学习(4)Git分布式优势与实战配置全解析
git·学习
览讯冷却8 小时前
冷却塔噪声的健康危害与法规要求的技术梳理
经验分享·笔记·科技·其他·百度·制造·业界资讯
Dory_Youth8 小时前
电脑的搜索功能不能用,一搜就黑屏闪退
运维·笔记
bessyon9 小时前
信息熵减与医疗交付:以3D检测与设备溯源为例
笔记
comyccccc11 小时前
STM32F407VET6核心板的部分电路绘制学习笔记
笔记·stm32·学习
叼烟扛炮11 小时前
Linux 学习笔记(三十六):并发进阶——读写锁 vs 自旋锁,到底怎么选?
linux·运维·服务器·笔记·学习
是隼人11 小时前
buuctf-pwn [极客大挑战 2019]Not Bad(orw+jmp)题解(学习过程持续更新)
学习·安全·pwn入门·ctf入门