在企业上使用 Hive 进行离线批量数据统计时,有时会遇到 Oozie 工作流调度失败,导致很多 ptdate 时间分区没有数据,可以通过 Hive 创建临时表存储所有缺失的ptdate时间分区数据,然后通过Hive动态分区查询临时表导入数据至最终统计结果表中。
一、在正式介绍 Hive 动态分区恢复静态分区表数据时,先介绍一下 hive load 导入数据的用法
hive load 用法:
(1)从本地加载文件中的数据并覆盖至表 lake_bg_ods.bigdata_test_20190905 中
load data local inpath '/home/bigdata/bigdata_test_20190905.txt'
overwrite table lake_bg_dm.bigdata_test_20190905;
(2)从HDFS上加载文件中的数据并追加至表 lake_bg_ods.bigdata_test_20190905 中
load data inpath '/home/bigdata/bigdata_test_20190905.txt'
into table lake_bg_dm.bigdata_test_20190905;
备注:
关键字 local 不加,数据从HDFS上加载;如果加 local ,数据从本地加载。
关键字 overwrite 为覆盖加载,会覆盖掉原有的数据; into 为 文件末尾追加数据,不会覆盖掉原有的数据。
二、Hive 动态分区恢复静态分区表数据
SET hive.exec.dynamic.partition=true; --(默认false),表示开启动态分区功能
SET hive.exec.dynamic.partition.mode=nonstrict; -- (默认strict),表示允许所有分区都是动态的,否则必须有静态分区字段
--每个maper或reducer可以允许创建的最大动态分区个数,默认是100,超出则会报错
SET hive.exec.max.dynamic.partitions.pernode = 1000;
-- 一个动态分区语句可以创建的最大动态分区个数,超出报错
SET hive.exec.max.dynamic.partitions=1000;
insert overwrite table lake_bg_dm.bigdata_test_20190905 partition(ptdate= ${ptdate}) --手动分区
select * from lake_bg_edw.bsl_bigdata_tmp;
insert into table lake_bg_dm.bigdata_test_20190905 partition(ptdate= ${ptdate}) --手动分区
select * from lake_bg_edw.bsl_bigdata_tmp;
insert overwrite lake_bg_dm.bigdata_test_20190905
partition(ptdate= ${ptdate}) --动态分区
select *, ptdate from lake_bg_edw.bsl_bigdata_tmp;
insert overwrite 会覆盖表或分区中已存在的数据
insert into 以追加数据的方式插入到表或分区,原有数据不会删除
insert 可以插入表或分区,如果表是分区表,则 insert 时需要指定插入到哪个分区
本文详细介绍了如何使用Hive动态分区功能恢复因Oozie工作流调度失败导致的缺失时间分区数据。通过创建临时表存储缺失ptdate时间分区,并利用动态分区特性将数据导入目标表,解决数据统计中的常见问题。
886

被折叠的 条评论
为什么被折叠?



