Spark SQL 讀到的記錄數與 hive 讀到的不一致

    問題:我用 sqoop 把 Mysql 中的數據導入到 hive,使用了--delete-target-dir --hive-import --hive-overwrite 等參數,執行了兩次。 mysql 中只有 20 條記錄。在 hive shell 中,查詢導入到的表的記錄,獲得結果 20 條,是對的。mysql

然而在 spark-shell 中,使用 spark sql 獲得的結果倒是 40 條。sql

又執行了一次 sqoop 的導入,hive 中仍然查詢到 20 條,而 spark shell 中卻獲得了 60 條!!shell

查了一下 HDFS 上,結果發現有 3 個文件oop

 

後來在網上看到有說 Hortonworks 中,用 Ambari 部署的 hive(V3.0),默認是開啓 ACID 的,Spark 不支持 hive 的 ACID。更改 hive 的以下參數,關閉 ACID 功能。spa

hive.strict.managed.tables=false 
hive.create.as.insert.only=false 
metastore.create.as.acid=false

刪除 hive 中的表,從新導入。3d

能夠看到,表目錄下的文件名變了,不是原來的 base_ 開頭的了。code

用 overwrite 的方式導入屢次,也仍是隻有這兩個文件,spark sql 讀取的數據也沒有出現翻倍的現象。blog

    至此,問題算是解決了。可是不明白爲何 hive 開啓 ACID 時,儘管表目錄下有多個文件,可是 hive shell 能知道到底哪一個是正確的,而 spark 則不知道。估計只有研究源碼才能解決問題了。ci

相關文章
相關標籤/搜索