Sqoopを使用してmysqlからハイブにテーブルをインポートしています。一部の列はlatin1でエンコードされています。次のいずれかを行う方法はありますか?
- これらの列のエンコーディングをHiveでlatin1として設定します。また
- sqoopでインポートするときに、列をutf-8に変換しますか?
Hiveでは、--default-character-setを使用して、少数の列に固有ではないデータベース全体の文字セットを設定します。テーブルの列をフライでutf-8に変換するSqoopパラメーターを見つけることができませんでした。むしろ、列はタイプを固定するように設定されていると予想されます。
$ sqoop import --connect jdbc:mysql://server.foo.com/db --table bar \
--direct -- --default-character-set=latin1
最初にMySqlでLatin1列をutf-8に変換してから、Sqoopからインポートする必要があると思います。次のスクリプトを使用して、すべての列をutf-8に変換できます 。これは、ここで見つけました。
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 &
問題は無関係であることが判明しました。列はエンコーディングに関係なく正常に機能します...しかし、テーブルのスキーマは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
、スキーマが変更された場合は、最初に手動でハイブを発行します。