Hive分区详解:静态分区、动态分区与混合分区
Hive分区详解:静态分区、动态分区与混合分区
分区表
使用场景:数据量庞大且经常用来做查询的表
特点:将数据分别存储到不同的目录里
优点:避免全盘扫描,提高查询效率
分区的类型
它们的默认值分别是:
- false
- strict(要求至少有一个静态分区列)
- nonstrict(允许所有分区列都是动态的)
1000:在每个 mapper 或 reducer 节点上允许创建的动态分区的最大数量。
注意: set 属性的修改只作用于当前会话
查看Hive中的属性设置
打开Hive命令行界面/Hue
示例>> 静态分区/动态分区
插入文件数据到静态分区(load data)
插入单条数据到静态分区(insert into )
从其他表插入数据到静态分区( insert into )
在 Hive 中,无论是静态分区还是动态分区,创建表时使用的 SQL 语句是相同的。这是因为分区的定义方式在表创建时是统一的,而分区的具体行为(静态或动态)是在数据插入时通过不同的操作来区分的。
静态分区:在插入数据时,分区值是明确指定的
- LOAD DATA 命令: 将数据从文件直接加载到 Hive 表中,适用于批量导入数据文件, 文件中的数据必须与表的非分区列匹配
- INSERT INTO 命令: 将数据从其他表或直接通过 VALUES 插入到目标表中,适合小规模数据插入或从其他表导入数据。
动态分区:在插入数据时,分区值是根据数据自动生成的
示例>>混合分区
在这个示例中:
- year 是静态分区列,其值固定为 '2023'。
- date 是动态分区列,其值从 source_table 中动态生成
Hive分区和Oracle分区的区别
oracle分区字段用的是表内字段;而hive分区字段采用表外字段。
临时表
是为数据提供一个临时的存储和转换空间,以便在将数据加载到目标表之前进行必要的处理或验证
完整分区过程
动态分区示例
第一步:先创建临时表
临时表包含目标表的所有字段及分区字段
第二步:导入数据到临时表
load data localinpath'./data/student2.txt'into tabletemp_part1;
静态分区示例
创建分区表
创建临时表
临时表需要包含目标表的所有字段(sid, name, gender, age, academy)以及分区字段(dt)
把数据加载到临时表
把临时表数据加载到目标表
混合分区示例
创建临时表
临时表需要包含目标表的所有字段(sid, name, gender, age, academy)以及分区字段(year, dt):
将数据加载到临时表
插入数据到目标表
动态分区和静态分区代码的区别
在于数据插入时分区值的指定方式
静态分区在插入数据时需要明确指定分区值。这种方式适用于已知分区值的场景,可以减少数据加载时的动态分区处理开销。
动态分区在插入数据时,分区值是根据数据自动生成的。这种方式适用于分区值未知或变化较大的情景,可以提高数据管理的灵活性。