如何从配置单元表插入分区表(作为镶木地板)?

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 则可以。我不知道你将如何使用之间。但它会像一个新表一样 - 所以你可以使用。

以上是关于如何从配置单元表插入分区表(作为镶木地板)?的主要内容,如果未能解决你的问题,请参考以下文章

保存分区 Parquet

将分区(火花)镶木地板加载到 bigquery 表

如何在 python 中使用 pyarrow 从 S3 读取分区镶木地板文件

从多个火花工人以镶木地板格式保存

从 Impala 分区拼花表创建文本表

如何附加到镶木地板文件以及它如何影响分区?