一、目的
在Hive的DWD层和DWS层建立动态分区表后,发现动态插入数据时可以指定分区名,也可以不指定分区名。因此,研究一下它们的区别以及使用场景,从而决定在项目的海豚调度HiveSQL的脚本里需不需要指定动态分区的分区名?
二、两种情形介绍
(一)动态分区表动态加载数据不指定分区
(二)动态分区表动态加载数据指定分区
三、两种情形区别
如果指定分区名的话就只能导入指定分区的数据;
如果不指定分区名的则可以导入所有分区的数据
四、两种情形使用场景
(一)动态分区表动态加载数据不指定分区名
不指定分区名的话意味着可以导入所有分区的数据,这种情形适用于历史数据。
因为历史数据属于不同的分区,不能指定固定的分区名
(二)动态分区表动态加载数据指定分区名
指定分区名的话意味着就只能导入指定分区的数据,这种情形适用于每天的增量数据。
因为在数仓项目尤其是离线数仓中,通常每天都是一个文件数据,每天处理前一天的增量数据,因此最好指定分区名,这样每天只需要增量导入前一天的数据。
以下是海豚调度HiveSQL任务的脚本------DWD层动态分区表加载数据指定分区
#! /bin/bash
source /etc/profile
nowdate=`date --date='0 days ago' "+%Y%m%d"`
yesdate=`date -d yesterday +%Y-%m-%d`
hive -e "
use hurys_dc_dwd;
set hive.vectorized.execution.enabled=false;
set hive.auto.convert.join=false;
set mapreduce.map.memory.mb=10150;
set mapreduce.map.java.opts=-Xmx6144m;
set mapreduce.reduce.memory.mb=10150;
set mapreduce.reduce.java.opts=-Xmx8120m;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.dynamic.partition=true;
set hive.exec.parallel=true;
set hive.support.concurrency=false;
set mapreduce.map.memory.mb=4128;
set hive.vectorized.execution.enabled=false;
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions.pernode=1000;
set hive.exec.max.dynamic.partitions=1500;
insert overwrite table dwd_turnratio partition(day='$yesdate')
select
regexp_replace(device_no,'\t+','') device_no,
create_time,
volume_sum,
volume_left,
volume_straight,
volume_right,
(volume_sum-volume_left-volume_straight-volume_right) volume_turn
from hurys_dc_ods.ods_turnratio
where volume_sum >= 0 and day= '$yesdate'
group by device_no, create_time, volume_sum, volume_left, volume_straight, volume_right
"
另附DWD层建表语句
--1.转向比数据内部表——动态分区 dwd_turnratio
create table if not exists dwd_turnratio(
device_no string comment '设备编号(点位)',
create_time timestamp comment '创建时间',
volume_sum int comment '指定时间段内通过路口的车辆总数',
volume_left int comment '指定时间段内通过路口的左转车辆总数',
volume_straight int comment '指定时间段内通过路口的直行车辆总数',
volume_right int comment '指定时间段内通过路口的右转车辆总数',
volume_turn int comment '指定时间段内通过路口的掉头车辆总数'
)
comment '转向比数据表——动态分区'
partitioned by (day date) --分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。
stored as orc --表存储数据格式为orc
;