背景
最近在做hive数仓清洗时候,遇到一个问题。当hive
在走tez
框架下,如果在最外层sql使用union all
做的hive表,切换其他引擎会查询不到数据,如切换presto、spark、starRocks等。
原因
原因也很简单。由于Hive在执行含有union all的语句时,是拆分并行执行,然后分别将结果存放在数据表目录下的HIVE_UNION_SUBDIR_x目录下,而其他大部分的引擎,都没有适配hive这种子目录的场景,所以导致查询不到数据,甚至是报错。
解决方案
1、修改查询引擎的参数,改为遍历多级目录下的文件
如果是hive,修改如下参数
set mapreduce.input.fileinputformat.input.dir.recursive=true;
如果是spark,修改如下参数
--conf spark.hive.mapred.supports.subdirectories=true
--conf spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive=true
其他查询引擎的设置大同小异,具体查询该引擎的文档。
2、建一个中间表存储结果
尽量不要在hiveSQL的最外层查询使用union all
,即使是用子查询把union
的结果封装,再join
其他表,也是不行的。如果实在无法避免这种SQL场景,则建一个中间表存储结果,把结果封装起来。具体写法这里不详细说明了。