如何从配置单元表插入分区表(作为镶木地板)?
Posted
技术标签:
【中文标题】如何从配置单元表插入分区表(作为镶木地板)?【英文标题】:how I can insert from hive table to partitioned table(as parquet)? 【发布时间】:2020-09-25 10:45:59 【问题描述】:我有配置表和分区表。
我插入到分区表中,如下所示。如果不存在则自动创建分区。
我在 impala 编辑器中运行此查询。
此查询耗时过长。
insert into default.dw_partitioned_table
partition (partition_islemtarih_string)
select *, cast(replace(strleft(recorddate,10),'-','')as int) as partition_islemtarih_string
from default.dw_hive_table
where recorddate <to_timestamp('2019-05-01 00:00:00', 'yyyy-MM-dd HH:mm:ss')
and recorddate>=to_timestamp('2019-01-01 00:00:00', 'yyyy-MM-dd HH:mm:ss');
我错过了什么或者我做错了什么?
提前致谢
【问题讨论】:
【参考方案1】:您的插入速度很慢,因为 impala 正在为原始表中的每个日期 replace(strleft(recorddate,10),'-','')
创建分区。 Impala 为每个分区创建物理文件,这就是它非常慢的原因。
如果您有大量记录,并且您真的想要在日期之前分发数据,那么这样做会花费很长时间。
更好的主意是在记录日期的 MM-yyyy 上进行分区 - 这将创建均匀分布的分区。查看您的 SQL,您似乎甚至可以在 yyyy 上进行分发。
另请注意,静态分区要快得多。例如 -insert into t partition (part_col='2020') select * from t2 ;
- 速度更快,因为 impala 不必创建动态分区。
【讨论】:
感谢您的回答,我更新了我的问题。我的分区是int。所以我不能这样做MM-yyyy。但我可以尝试插入自动创建的分区表。 然后删除 - 并将密钥更改为 yyyyMM all in one。这也是独一无二的。 也请使用cast(from_timestamp(recorddate,'yyyyMM')as int)
以确保您的分区正常工作
谢谢回复,那我可以用between
关键字的分区吗?
如果您发出 SELECT 则可以。我不知道你将如何使用之间。但它会像一个新表一样 - 所以你可以使用。以上是关于如何从配置单元表插入分区表(作为镶木地板)?的主要内容,如果未能解决你的问题,请参考以下文章