2013-03-26 23 views
2

我正在使用Sqoop將一個表從mysql導入配置單元。一些列是latin1編碼的。有沒有辦法做到這一點:編碼Hive中的列

  1. 在Hive中將這些列的編碼設置爲latin1。 OR
  2. 使用sqoop導入時,將列轉換爲utf-8?

回答

1

原來問題是無關的。該列工作正常,無論編碼...但在MySQL中表的模式已更改。我認爲,由於我傳遞覆蓋標誌,sqoop會在Hive中每次都重新創建表。並非如此! mysql中的模式更改沒有傳送給Hive,因此md5列中的數據實際上來自不同列的數據。

我們解決的「修復」是,在每次sqoop導入檢查模式更改之前,如果發生更改,請刪除表並重新導入。這會強制Hive中的模式更新。

編輯:我原來sqoop命令是這樣的:

sqoop import --connect jdbc:mysql://HOST:PORT/DB --username USERNAME --password PASSWORD --table uploads --hive-table uploads --hive-import --hive-overwrite --split-by id --num-mappers 8 --hive-drop-import-delims --null-string '\\N' --null-non-string '\\N' 

但現在我手動發出drop table uploads如果架構更改第一蜂巢。

+0

這將很好地添加您的完整Sqoop命令添加到上面的答案。 – AvkashChauhan 2013-03-27 01:39:59

+0

好的,完成了!希望能幫助到你。 – 2013-03-27 02:08:42

2

在Hive中--default-character-set用於設置整個數據庫的字符集,而不是特定於少數列。我無法找到Sqoop參數,該參數會將表格列轉換爲utf-8,而列預計將設置類型固定。

$ sqoop import --connect jdbc:mysql://server.foo.com/db --table bar \ 
--direct -- --default-character-set=latin1 

我相信你會需要Latin1的第一列轉換爲UTF-8在你的MySQL,然後你可以從Sqoop進口。您可以使用以下腳本將所有列轉換爲utf-8,其中我發現了here

mysql --database=dbname -B -N -e "SHOW TABLES" | \ 
awk '{print "ALTER TABLE", $1, "CONVERT TO CHARACTER SET utf8 COLLATE \ 
utf8_general_ci;"}' | mysql --database=dbname & 
+0

謝謝!但問題變成了別的......看到我的答案。 – 2013-03-27 01:08:23

+0

我嘗試根據最初報告的問題來回答。不要相信-ve標記適合原始答案。 – AvkashChauhan 2013-03-27 03:30:27

+0

我同意!我不知道誰在貶低你。 – 2013-03-27 14:13:54