我正在使用 Sqoop 将表从 mysql 导入配置单元。有些列是 latin1 编码的。有什么办法可以做到:
- 在 Hive 中将这些列的编码设置为 latin1。或者
- 使用 sqoop 导入时将列转换为 utf-8?
在 Hive 中 --default-character-set 用于设置整个数据库的字符集,而不是特定于几列。我无法找到 Sqoop 参数,该参数会将表列转换为 utf-8,而是希望列将类型设置为固定。
$ 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 中已更改。我假设因为我传入了覆盖标志,所以每次在 Hive 中,sqoop 都会重新制作表。不是这样!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
但是现在,如果架构发生变化,我首先手动发出一个配置单元。