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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM