关于hive使用union后切换引擎查询不到数据的问题

背景

最近在做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场景,则建一个中间表存储结果,把结果封装起来。具体写法这里不详细说明了。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇