HiveTezUnion问题

问题描述

在 hive on tez 中,使用类似 insert overwrite A select * from B union select * from C 操作时,会导致插入的表或分区目录下有子目录,引起除hive on tez之外的引擎不可查数据。

问题原因

tez 对于 insert union 操作做了优化,通过并行加快速度,同时防止表目录或分区目录下有相同文件,所以在输出的时候各自生成了子目录。但是在用户查询时,只有 hive tez 能正常查询。其他引擎因为子目录问题无法查询。

解决办法

  1. 所有 hive 均使用 tez 引擎

  2. 使用 sparkSQL 进行 inert union 操作

  3. 使用 tez 进行 insert union 操作时 加上 order by 操作

  4. 开启 MR 递归查询模式:

    1
    2
    set hive.mapred.supports.subdirectories=true;
    set mapreduce.input.fileinputformat.input.dir.recursive=true;
  5. spark 查询时:

    1
    set mapreduce.input.fileinputformat.input.dir.recursive=true

后面两种方案需要考虑是否会对其他任务造成影响,建议前面两种。