已复制
全屏展示
复制代码

什么是 hive 动态分区

· 2 min read

Hive 的动态分区是指在 Hive 表中,分区字段的值 是在数据加载过程中动态生成的。这使得数据加载更加灵活,不需要事先知道所有分区的值,而是根据实际数据动态创建分区。

1. 创建表时指定分区字段

首先在创建表时指定分区字段

CREATE TABLE test.student (
    id INT,
    name STRING,
    age INT
)
PARTITIONED BY (dt STRING, hour STRING)
STORED AS ORC;

2. 设置动态分区模式

-- 开启动态分区功能,默认 true
set hive.exec.dynamic.partition=true


-- 设置为非严格模式,动态分区的模式默认为 strict
-- strict 模式表示必须指定至少一个分区为静态分区
-- nonstrict 模式表示允许所有的分区字段都可以使用动态分区
set hive.exec.dynamic.partition.mode=nonstrict


-- 在所有执行 MR 的节点上,最大一共可以创建多少个动态分区。
set hive.exec.max.dynamic.partitions=1000


-- 在每个执行MR的节点上,最大可以创建多少个动态分区。
-- 比如:源数据中包含了一年的数据,即 day 字段有 365 个值
-- 那么该参数就需要设置成大于 365,如果使用默认值 100,则会报错。
set hive.exec.max.dynamic.partitions.pernode=1000


-- 整个 MR Job 中,最大可以创建多少个 HDFS 文件。
set hive.exec.max.created.files=100000


-- 当有空分区生成时,是否抛出异常。一般不需要设置。
set hive.error.on.empty.partition=false

3. 加载数据到动态分区

加载数据到表中的动态分区,在加载数据时,不需要指定分区的具体值,而是在INSERT语句中通过PARTITION子句来指定分区字段的值。

set hive.exec.dynamic.partition=true
set hive.exec.dynamic.partition.mode = nonstrict;

INSERT OVERWRITE TABLE test.student PARTITION(dt, hour)
SELECT id, name, age, dt, hour FROM some_source_table;

4. 分区修复

-- 当删除了hdfs上的分区目录以后,可以使用下面命令删除元数据中的分区信息。
MSCK REPAIR TABLE test.student drop partitions;

-- 当有新的分区生成时,使用下面命令更新元数据的分区信息。
MSCK REPAIR TABLE test.student

hive on spark 参数

set hive.strict.checks.type.safety=false;set spark.master=yarn-cluster;set spark.yarn.queue=production;set spark.dynamicAllocation.enabled=false;set hive.execution.engine=spark;set spark.executor.cores=4;set spark.executor.instances=12;set spark.executor.memory=8g;set spark.driver.cores=2;set spark.driver.memory=4g;

🔗

文章推荐