問題:我用 sqoop 把 Mysql 中的數據導入到 hive,使用了--delete-target-dir --hive-import --hive-overwrite 等參數,執行了兩次。 mysql 中只有 20 條記錄。在 hive shell 中,查詢導入到的表的記錄,得到結果 20 條,是對的。
然而在 spark-shell 中,使用 spark sql 得到的結果卻是 40 條。
又執行了一次 sqoop 的導入,hive 中仍然查詢到 20 條,而 spark shell 中卻得到了 60 條!!
查了一下 HDFS 上,結果發現有 3 個文件
后來在網上看到有說 Hortonworks 中,用 Ambari 部署的 hive(V3.0),默認是開啟 ACID 的,Spark 不支持 hive 的 ACID。更改 hive 的如下參數,關閉 ACID 功能。
hive.strict.managed.tables=false hive.create.as.insert.only=false metastore.create.as.acid=false
刪除 hive 中的表,重新導入。
可以看到,表目錄下的文件名變了,不是原來的 base_ 開頭的了。
用 overwrite 的方式導入多次,也還是只有這兩個文件,spark sql 讀取的數據也沒有出現翻倍的現象。
至此,問題算是解決了。但是不明白為什么 hive 開啟 ACID 時,盡管表目錄下有多個文件,但是 hive shell 能知道到底哪個是正確的,而 spark 則不知道。估計只有研究源碼才能解決問題了。