問題:我用 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