如果 INSERT OVERWRITE 的 SELECT 查询没有 return 任何结果,是否有办法防止 Hive table 被覆盖

Is there a way to prevent a Hive table from being overwritten if the SELECT query of the INSERT OVERWRITE does not return any results

我正在开发一个批处理作业,将数据从 HDFS 文件加载到 Hive tables。数据流向如下

  1. 使用外部 Hive 读取 HDFS 中接收到的文件 table
  2. 从外部 Hive table 应用某些转换
  3. 插入覆盖最终的 hive table
  4. 将收到的文件移动到存档

如果输入目录中有文件供外部 table 在步骤 1 中读取,则此流程工作正常。 如果没有文件,外部 table 将为空,因此执行步骤 2 将清空最终 table。如果外部table为空,我想保留最后table中已有的数据(上次执行时加载的数据)

是否有我可以设置的配置单元 属性,以便仅当我们用一些数据覆盖它时才覆盖最后的 table?

我知道我可以使用 HDFS 命令检查输入文件是否存在并有条件地启动 Hive 请求。但我想知道我是否可以直接在 Hive 中实现相同的行为,这将帮助我避免这种额外的验证

尝试将虚拟分区添加到您的 table,比如 LOAD_TAG 并使用动态分区加载:

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

INSERT OVERWRITE TABLE your_table PARTITION(LOAD_TAG)
select
      col1,
      ...
      colN,
      'dummy_value' as LOAD_TAG
  from source_table;

您的分区值应始终相同。