mysql 导出中文乱码_sqoop导出到mysql中文乱码问题总结、utf8、gbk
今天使用sqoop1.4.5版本的(hadoop使用cdh5.4)因為亂碼問題很是頭痛半天。下面進行一一總結
命令:
[root@sdzn-cdh01 etc]# sqoop export --connect "jdbc:mysql://192.168.200.40:3306/otherdb?useUnicode=true&characterEncoding=utf-8" -m 1 ?--username root --password root --table use_02 --export-dir /sdzn_yhhx/user0/ --input-null-string "\\\\N" --input-null-non-string "\\\\N" --input-fields-terminated-by "," --input-lines-terminated-by "\\n"
一.連接數據庫主機失敗
異常表象:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
1.沒有mysql-connect-jdbc.jar的驅動jar包
2.不能ping通訪問的主機
二.訪問權限問題
異常:
Error executing statement: java.sql.SQLException: Access denied for user 'root'@'sdzn-cdh01.zhiyoubao.com' (using password: YES)
問題分析出現上述權限異常,說明200.40所屬的mysql中的otherdb數據庫沒有設置sdzn-cdh01主機的訪問權限。換句話,192.168.200.40所在的mysql禁止sdzn-cdh01主機訪問,或者訪問數據庫的名稱、密碼有誤。因為在默認情況下mysql的中的數據庫的訪問信息為:root@‘localhost’,所以要重置其訪問權限。需要說明一點數據庫的訪問登錄名和密碼與其進入數據庫操作平臺的登錄名和密碼完全是兩回事不要將二者混為一談
操作如下:
首先進入mysql 命令操作平臺查看用戶權限,以確保是否存在該用戶的權限
#mysql -u root -p
mysql>SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
如沒有再去為該主機的用戶添加權限
添加相應權限
grant ?權限? on? 數據庫名.表名 to 用戶名@'可以訪問的地址' identified by "密碼"
設置之后要刷新mysql>flush privileges;
三.數據格式問題
如下所示:
Caused by: java.lang.RuntimeException: Can't parse input data: '1,i'
at use_02.__loadFromFields(use_02.java:249)
at use_02.parse(use_02.java:192)
at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:83)
異常分析:
同步的為mysql結構化數據,對數據格式有固定的要求。所以說當集群文件中數據格式與mysql表中存在沖突時,會導致數據傳輸異常。
問題解決:1.查看hdfs中文件數據是否與mysql表中對應的表字段數據類型一致(hdfs中string對應mysql中varchar或者char類型等等)
2.查看sqoop命令中分隔符是否與hdfs相應文件中分隔符一致
四.中文亂碼問題
最后在說亂碼問題,萬事俱備只欠東風。亂碼問題是同步數據中最常見的問題之一。
具體的亂碼顯示不在貼出。
問題分析:亂碼問題由于兩個平臺數據編碼不一致造成的。或者遠程連接平臺編碼問題以及sqoop命令中編碼問題
1.修改sqoop編碼[root@sdzn-cdh01 etc]# sqoop export --connect "jdbc:mysql://192.168.200.40:3306/otherdb?useUnicode=true&characterEncoding=utf-8"
2.在創建數據庫時指定編碼,
mysql>?CREATE?DATABASE?`otherdb`?DEFAULT?CHARACTER?SET?utf8?COLLATE?utf8_general_ci;
mysql>use?otherdb;
mysql> create table ?use_02 (remark varchar(20),groupName varchar(225)) charset utf8 collate utf8_general_ci;
3.修改mysql數據編碼
4.修改遠端訪問平臺編碼
五.源數據中存在特殊字符
原:
[root@sdzn-cdh01 ~]# sqoop export --connect "jdbc:mysql://192.168.0.197:3306/otherdb?useUnicode=true&characterEncoding=utf-8" -m 1 ?--username root --password root --table order_raw_info ?--export-dir '/user/hive/warehouse/zyb.db/order_raw_info/' --input-null-string "\\\\N" --input-null-non-string "\\\\N" --input-fields-terminated-by "\001" --in^Ct-lines-terminated-by "\\n"
異常:
Caused by: java.io.IOException: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\xB025...' for column 'link_name' at row 52
at org.apache.sqoop.mapreduce.AsyncSqlRecordWriter.write(AsyncSqlRecordWriter.java:233)
at org.apache.sqoop.mapreduce.AsyncSqlRecordWriter.write(AsyncSqlRecordWriter.java:46)
at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.write(MapTask.java:655)
at org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl.write(TaskInputOutputContextImpl.java:89)
at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.write(WrappedMapper.java:112)
at org.apache.sqoop.mapreduce.TextExportMapper.map(TextExportMapper.java:84)
... 10 more
Caused by: java.sql.SQLException:?Incorrect string value: '\xF0\x9F\x90\xB025...' for column 'link_name' at row 52
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1192)
at org.apache.sqoop.mapreduce.AsyncSqlOutputFormat$AsyncSqlExecThread.run(AsyncSqlOutputFormat.java:233)
方案:
[root@sdzn-cdh01 ~]# sqoop export --connect "jdbc:mysql://192.168.0.197:3306/otherdb?useUnicode=true&characterEncoding=gbk" -m 1 ?--username root --password root --table order_raw_info ?--export-dir '/user/hive/warehouse/zyb.db/order_raw_info/' --input-null-string "\\\\N" --input-null-non-string "\\\\N" --input-fields-terminated-by "\001" --in^Ct-lines-terminated-by "\\n"
在sql中如圖:
SQL語句:
create table ?order_raw_info (id int,create_time varchar(50),order_code varchar(50),link_name varchar(225),sex varchar(50),city varchar(50),tel varchar(50),certificate_no varchar(50),close_total_price double,popnum int,occ_date varchar(50),tourname varchar(50)) charset gbk ;
總結
以上是生活随笔為你收集整理的mysql 导出中文乱码_sqoop导出到mysql中文乱码问题总结、utf8、gbk的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸢尾花分类_机器学习:鸢尾花数据集--贝
- 下一篇: mysql总是出现-_mysql 总是莫