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 - 替换表分区中的所有数据的主要内容,如果未能解决你的问题,请参考以下文章