Hive on Spark 和Hive on mr执行结果不一致原因剖析

一、Hive 执行引擎概述

  目前hive执行引擎支持三种,包括mr、spark和Tz;mr是hive最早支持的数据类型,执行速度最慢,但是性能上也是最为稳定的;spark和Tz是后续支持的执行引擎,也是将hive的SQL语句转换为spark可以识别的sparksql语句进行执行。

二、当有空表出现时,spark和mr执行引擎结果不一样问题排查

 示例:select * from a left join b a.id = b.id left join c on a.id = c.id;

如果C表是空表,会导致spark引擎和mr引擎执行结果不一致;

经过和presto的执行结果对比发现,presto的执行结果和mr的执行结果是一样,结果显示如下:

 

 三、不一致原因分析

   一般来说hive在执行SQL时,默认开启了hive.auto.convert.join = true;此时会把小表放入内存中,由于C表是空表也就是最小的表;此时c表被broadcast,此时小表会放入到内存中;而换成spark执行引擎只后,发现该参数没有生效,导致与c表进行left join的字段都变成了空字段;

  当把该参数设置为false之后set hive.auto.convert.join = false,再执行,mr和spark的结果一样了

posted @ 2021-03-05 10:11  虎啸千峰  阅读(2351)  评论(0编辑  收藏  举报