sqoop导出到mysql中文乱码问题总结、utf8、gbk

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
    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数据编码

    具体连接:http://blog.csdn.net/xiaoshunzi111/article/details/52817034

    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 ;

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
    标签: mysql

    “sqoop导出到mysql中文乱码问题总结、utf8、gbk” 的相关文章

    SpringBoot怎么接收前端传来的json数据 - 开发技术

    本文小编为大家详细介绍“SpringBoot怎么接收前端传来的json数据”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot怎么接收前端传来的json数据”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。SpringBoot接...

    Pro Android学习笔记(一二三):Telephony API(5):Phone

    作者@恺风Wei。拨打电话拨打电话和发Email一样不属于Telephony API,通过intent调用拨号器App应用的。代码例子如下: Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("tel:13312345678")); s...

    华为OD机试 - 热点网络统计(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】

    热点网络统计 题目 企业路由器的统计页面,有一个功能,需要动态统计公司访问最多的网页URL topN 请设计一个算法,可以高效动态统计TopN的页面 输入 每一行都是一个URL或一个数字 如果是URL代表一段时间内的网页访问 如果是一个数字N 代表本次需要输出的TopN个URL 输入约束...

    基于SpringBoot和Vue3的博客平台发布、编辑、删除文章功能怎么实现 - 开发技术

    这篇“基于SpringBoot和Vue3的博客平台发布、编辑、删除文章功能怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于SpringBoot...

    增删改查sql语法

    sql中增删改查语句 1、“INSERT INTO”语句用于向表格中增加新的行 2、“DELETE”语句用于删除表中的行 3、“Update”语句用于修改表中的数据 4、“SELECT”语句用于从表中选取数据 一、增加语法 INSERT INTO 表名 VALUES (值1,....) 例如...

    php如何删除一条数组记录 - 编程语言

    这篇文章主要介绍了php如何删除一条数组记录的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php如何删除一条数组记录文章都会有所收获,下面我们一起来看看吧。 PHP提供了许多内置函数来操作数组。你可以使用这些函...