【问题标题】:Impala - Replace all data in a table's partitionImpala - 替换表分区中的所有数据
【发布时间】:2023-03-16 08:25:01
【问题描述】:

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

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

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

【问题讨论】:

  • 你的 impala 表是外部表吗?
  • 可能是外部的,也可能是内部的。我有选择。

标签: hadoop cloudera-cdh 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分区”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 2021-11-05
相关资源
最近更新 更多