Impala - 替换表分区中的所有数据

Posted

技术标签:

【中文标题】Impala - 替换表分区中的所有数据【英文标题】:Impala - Replace all data in a table's partition 【发布时间】:2017-04-20 15:53:02 【问题描述】:

我有一个程序可以生成有关 Impala 表分区的所有数据。该程序将数据写入 HDFS 文本文件。

如何(物理上)移除之前属于该分区的所有数据,并将其替换为以 Parquet 格式转换的新 Text 文件中的数据?

如果我使用原始 HDFS API 物理删除组成分区的旧 Parquet 文件,它会干扰 Impala 吗?

【问题讨论】:

你的 impala 表是外部表吗? 可能是外部的,也可能是内部的。我有选择。 【参考方案1】:

为您的文本文件创建表格:

create external table stg_table (...) location '<your text file in hdfs>';

外部数据更改后,您必须刷新它:

refresh stg_table;

然后插入到你的目标表中

insert overwrite table target_table select * from stg_table;

如果您的目标表已分区,请执行以下操作:

insert overwrite table target_table partiton(<partition spec>) select * from stg_table;

关键字“覆盖”可以解决问题,它会覆盖表或分区。

【讨论】:

谢谢。有用。然而,“插入覆盖”语句需要时间。此外,我不确定操作是原子的。如果有关此分区的 Impala SQL 查询在“插入覆盖”运​​行期间到达会发生什么?有没有办法让这个“分区交换”过程原子化和更快。用于指定分区的 Parquet 文件位置的 ALTER 语句是什么? 如:“alter table p1 partition (month=1, day=1) set location '/usr/external_data/new_years_day';” 或者通过编程方式(使用 Hadoop FileSystem)删除 Impala 存储分区的 HDFS 文件夹,然后使用我的 Spark 作业生成的 Parquet 文件重新创建文件夹,最后执行:“alter table t1 recover分区”

以上是关于Impala - 替换表分区中的所有数据的主要内容,如果未能解决你的问题,请参考以下文章

Impala分区表

Impala 如何支持分区?

为分区数据定义 Impala 表模式

单表千亿电信大数据场景,使用Spark+CarbonData替换Impala案例

IMPALA:基于未分区表创建新的分区表

如何查看 impala 表中的分区数