如何将现有的每小时分区合并到配置单元中的每日分区
How to merge existing hourly partitions to daily partition in hive
我的要求是将所有天的现有每小时分区合并到每日分区。
我的分区列是这样的:
2019_06_22_00, 2019_06_22_01, 2019_06_22_02, 2019_06_22_03..., 2019_06_22_23 => 2019_06_22
2019_06_23_00, 2019_06_23_01, 2019_06_23_02, 2019_06_23_03..., 2019_06_23_23 => 2019_06_23
最简单的方法是从当前分区列中提取日期并加载到新的 table。
新建 table:
create table new (
...
)
partitioned by (partition_date date);
然后从旧 table 插入覆盖:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table new partition(partition_date )
select
col1,
col2,
...
coln,
--extract hours if you need this column
substr('old_partition_col',12,2) hour,
--partition column is the last one
date(concat_ws('-',substr(old_partition_col,1,4),substr(old_partition_col,6,2),substr(old_partition_col,9,2))) as partition_date
from old_table;
或者,您可以使用 unix_timestamp
和 from_unixtime
函数提取日期:
from_unixtime(unix_timestamp(old_partition_col,'yyyy_MM_dd_HH'),'yyyy-MM-dd') as partition_date
然后删除旧的 table 并重命名新的。
我的要求是将所有天的现有每小时分区合并到每日分区。
我的分区列是这样的:
2019_06_22_00, 2019_06_22_01, 2019_06_22_02, 2019_06_22_03..., 2019_06_22_23 => 2019_06_22
2019_06_23_00, 2019_06_23_01, 2019_06_23_02, 2019_06_23_03..., 2019_06_23_23 => 2019_06_23
最简单的方法是从当前分区列中提取日期并加载到新的 table。
新建 table:
create table new (
...
)
partitioned by (partition_date date);
然后从旧 table 插入覆盖:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table new partition(partition_date )
select
col1,
col2,
...
coln,
--extract hours if you need this column
substr('old_partition_col',12,2) hour,
--partition column is the last one
date(concat_ws('-',substr(old_partition_col,1,4),substr(old_partition_col,6,2),substr(old_partition_col,9,2))) as partition_date
from old_table;
或者,您可以使用 unix_timestamp
和 from_unixtime
函数提取日期:
from_unixtime(unix_timestamp(old_partition_col,'yyyy_MM_dd_HH'),'yyyy-MM-dd') as partition_date
然后删除旧的 table 并重命名新的。