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的结果一样了