如果INSERT OVERWRITE的SELECT查询没有返回任何结果,有没有办法防止Hive表被覆盖

时间:2017-11-23 08:58:20

标签: hadoop hive hiveql

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

  1. 使用外部Hive表读取在HDFS中收到的文件
  2. INSERT OVERWRITE应用某些转换的外部Hive表中的最终配置单元
  3. 将收到的文件移至存档
  4. 如果在步骤1中读取外部表的输入目录中有文件,则此流程可正常工作。 如果没有文件,则外部表将为空,因此执行步骤2将清空最终表。如果外部表为空,我想将现有数据保留在最终表中(上一次执行期间加载的数据)。

    我是否可以设置一个hive属性,以便只有在我们用一些数据覆盖它时才会覆盖最终表?

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

1 个答案:

答案 0 :(得分:2)

尝试在表中添加虚拟分区,比如说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;

在您的情况下,分区值应始终相同。