一、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的結果一樣了