饭宝 发表于 2024-11-6 16:15:52

hive底子知识分享(一)

写在前面

今天来学习hive部门的知识。
Hive 相关概念

Hive是什么?

Apache Hive 是一个基于 Hadoop 的数据仓库工具,旨在通过 SQL 类似的查询语言(称为 HiveQL)来实现对存储在 HDFS(Hadoop Distributed File System)中的大规模数据的查询、分析和管理。它为数据分析提供了一种高条理的抽象,使得用户能够使用熟悉的 SQL 语法对数据举行操纵。Hive 是 SQL 解析引擎,它将 SQL 语句转译成 MapReduce 任务并在 Hadoop 上执行,用户无需深入了解底层的 MapReduce 计算模型。Hive 的表实际上就是 HDFS 的目录,按表名把文件夹分开;如果是分区表,则分区值是子文件夹,可以直接在 MapReduce 任务中使用这些数据。
Hive的架构


[*]元数据:包罗表名、表所属的数据库(默认是 default)、表的拥有者、列/分区字段、表的范例(是否是外部表)、表的数据所在目录等。默认存储在自带的 Derby 数据库中,保举使用 MySQL 存储 Metastore。
[*]数据存储:数据使用 HDFS 举行存储,计算则通过 MapReduce、Spark 或 Tez 实现。
[*]驱动器:

[*]解析器(SQL Parser):将 SQL 字符串转换为抽象语法树(AST),这一步通常通过第三方工具库完成(如 Antlr),并对 AST 举行语法分析。
[*]编译器(Physical Plan):将 AST 编译成逻辑执行计划。
[*]优化器(Query Optimizer):对逻辑执行计划举行优化。
[*]执行器(Execution):将逻辑执行计划转换为物理执行计划,通常在 Hive 中就是 MapReduce 或 Spark 任务。

Hive与MySQL的区别


[*]查询语言:Hive 使用类 SQL 查询语言 HQL,熟悉 SQL 的开发者可以轻松上手。
[*]数据存储位置:Hive 的数据存储在 HDFS 中,而 MySQL 的数据存储在本地文件系统或块设备中。
[*]数据格式:Hive 没有专门的数据格式,数据以文本形式存储;MySQL 数据有严格的格式化和结构化存储。
[*]数据更新:Hive 在 0.14 版本后支持更新操纵,但整体较弱;MySQL 支持频繁的增删改操纵。
[*]索引:Hive 不会对数据举行索引处理,访问耽误较高;MySQL 支持索引,查询速度较快。
[*]执行计算:Hive 使用 MapReduce 执行计算,而 MySQL 使用自有的执行引擎。
[*]数据规模:Hive 可以处理更大规模的数据,由于它建立在 Hadoop 集群之上并支持并行计算;MySQL 更适合处理小规模数据。
Hive常用的存储格式,优缺点,使用场景


[*]TEXTFILE:

[*]长处:易于读取和查看,支持多种分隔符。
[*]缺点:无压缩,存储空间大,性能差。
[*]使用场景:重要用于与其他系统的数据交互,通常不保举用于事实表和维度表。

[*]ORCFILE:

[*]长处:列式存储,支持高压缩比,查询性能好,支持 MapReduce 并行处理。
[*]缺点:读写时需要额外的 CPU 资源举行压缩息争压缩。
[*]使用场景:适合存储大规模数据的事实表,能有用节省存储和计算资源。

[*]PARQUET:

[*]长处:支持复杂数据范例(如数组、结构体),适合嵌套数据结构,列式存储。
[*]缺点:压缩比大概不如 ORC 高。
[*]使用场景:适用于存储需要处理复杂嵌套数据的场景。

行式存储与列式存储的区别


[*]行式存储 (Row-oriented Storage):

[*]存储方式:将一整行的数据存储在一起。
[*]适用场景:OLTP(联机事务处理),如生意业务系统。
[*]长处:快速读取单行数据,适合频繁的插入、更新和删除操纵。
[*]缺点:举行分析查询时,读取整行数据大概导致性能下降。

[*]列式存储 (Column-oriented Storage):

[*]存储方式:将每一列的数据存储在一起。
[*]适用场景:OLAP(联机分析处理),如数据仓库、大数据分析。
[*]长处:适合大规模数据分析和聚合查询,能够更好的压缩数据。
[*]缺点:对于单行的读写操纵性能较差。

Hive常用的数据范例

https://gitee.com/Xplus1bigdata/mypng/raw/master/mypng/image-20241008093142723.png

[*]基本范例:INT, BIGINT, FLOAT, DOUBLE, STRING, DATE, TIMESTAMP
[*]复杂范例:

[*]ARRAY:数组范例。
[*]MAP:键值对范例。
[*]STRUCT:命名字段集合范例。
[*]UNION:选择一种数据范例举行存储,值必须完全匹配。

内部表vs外部表


[*]内部表:

[*]数据存储在默认路径 /user/hive/warehouse/ 下。
[*]删除表时,会删除表的数据。
[*]适合数据完全由 Hive 管理的场景。

[*]外部表:

[*]数据存储路径可以自定义。
[*]删除表时,仅删除表的元数据,数据依然存在。
[*]适合需要与其他系统共享数据,或数据恒久保留的场景。

分区 vs 分桶


[*]分区:按某列的值将数据物理分隔,常见于日期、区域等字段。适合减少数据扫描量,提升查询服从。
[*]分桶:将数据匀称分配到固定命量的桶中。适合优化连接和聚合操纵,尤其是在连接条件包罗分桶列时,可以减少数据的移动量。
Hive建表时需要考虑的因素


[*]分区与分桶:根据业务需求,分区通常按业务日期举行,分桶用于优化查询性能。
[*]外部表:建议使用外部表,制止因误删而丢失数据。
[*]存储格式与压缩:选择符合的存储格式(如 ORC、Parquet)和压缩格式(如 Snappy、Gzip)。
[*]命名规范:表和列名要规范,制止使用保留字或难以理解的命名。
[*]数据分层:根据业务逻辑分层管理数据,制止表设计过于复杂。
Hive 数据加载与动态分区

Hive 怎样加载数据

1. 使用 LOAD DATA 命令


[*]从 HDFS 导入数据:
LOAD DATA INPATH '/test/' INTO TABLE students_from_hdfs;

[*]路径可以是目录,Hive 会将该目录下的全部文件导入表中,文件格式必须与表定义时指定的存储格式一致。
[*]从 HDFS 加载的数据会被移动到该表的存储目录下。

[*]从本地文件系统导入:
LOAD DATA LOCAL INPATH '/test/' INTO TABLE students_from_local;

[*]文件会上传至表对应的目录。
[*]本地数据会保留,不会删除。

2. 表对表加载


[*]创建新表并将数据插入:
CREATE TABLE IF NOT EXISTS students_select AS SELECT * FROM students;
[*]插入数据到现有表:
INSERT INTO TABLE students_ins SELECT * FROM students;

[*]使用 INSERT OVERWRITE 会覆盖目的表中的数据。

3. 手动上传数据


[*]通过 HDFS 命令上传数据:hdfs dfs -put /data/ /user/hive/warehouse/students/

[*]在 Hive 命令行中也可以使用 -put 上传数据到 HDFS。

Hive 中什么是动态分区?

在使用动态分区插入数据时,Hive 会根据插入语句中指定的分区字段的值来创建分区。这意味着,如果插入数据时某个分区字段的值在现有的分区中不存在,Hive 会主动创建该分区。
设置动态分区参数

在执行动态分区插入之前,需要设置以下参数:
SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;-- 允许创建新分区示例:


[*]创建带有分区的表:
CREATE TABLE students (
name STRING,
age INT
)
PARTITIONED BY (year INT, month INT);
[*]插入数据并主动创建分区:
INSERT INTO TABLE students PARTITION (year, month)
SELECT name, age, 2024, 10 FROM temp_students;

[*]如果 year=2024 和 month=10 的分区不存在,Hive 会主动创建该分区。

通过使用动态分区,Hive 能够更加机动地管理分区数据,减少手动管理分区的复杂性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: hive底子知识分享(一)