• 【Sqoop】解决 “Sqooq从Hive中导出数据到MySQL中出现乱码” 的问题


    【问题现象】

    1、最初的Sqoop语句

    sqoop export \
    --connect jdbc:mysql://192.168.232.129:3306/test \
    --username root \
    --password password \
    --export-dir /user/hive/warehouse/test_for_exam.db/jobs \
    --table jobs \
    --input-fields-terminated-by "\t"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    【执行结果】数据成功导入但是有乱码

    在这里插入图片描述

    2、网上查找原因后的Sqoop语句

    sqoop export \
    --connect "jdbc:mysql://192.168.232.129:3306/test?useUnicode=true&characterEncoding=utf-8" \
    --username root \
    --password password \
    --export-dir /user/hive/warehouse/test_for_exam.db/jobs \
    --table jobs \
    --input-fields-terminated-by "\t"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    【执行结果】数据导入失败并报错

    22/06/24 14:30:05 ERROR mapreduce.ExportJobBase: Export job failed!
    22/06/24 14:30:05 ERROR tool.ExportTool: Error during export: 
    Export job failed!
    	at org.apache.sqoop.mapreduce.ExportJobBase.runExport(ExportJobBase.java:445)
    	at org.apache.sqoop.manager.SqlManager.exportTable(SqlManager.java:931)
    	at org.apache.sqoop.tool.ExportTool.exportTable(ExportTool.java:80)
    	at org.apache.sqoop.tool.ExportTool.run(ExportTool.java:99)
    	at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
    	at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
    	at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
    	at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
    	at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
    	at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3、不断试错后,注意到关键点是编码问题

    检查数据库编码和表的编码发现都不是utf-8编码:

    数据库的编码:
    在这里插入图片描述

    表的编码:

    在这里插入图片描述


    【解决办法】

    1. 方式一:修改数据库和表的编码,再次执行Sqoop语句即可。记得加上?useUnicode=true&characterEncoding=utf-8

    2. 方式二:从根部修改,一次性解决问题。

      # 查看一MySQL下字符集
      show variables like 'character_set%';
      
      • 1
      • 2

      这里可以很明显的看到,字符集全错了。

      MySQL 字符集大体可以分为下面两个方面:

      1. Server 级别字符集
        Server 级别的字符集,即数据存储到数据库时使用的字符集,又可以细化分为库级别、表级别和字段级别;
        一般来说,如果建库建表时没有特别指定,那么就会使用 Server 级别的字符集;

        Server 级别的字符集可以使用 character_set_server 参数指定;

      2. Client 级别字符集
        Client 级别的字符集,即客户端连接进数据库时使用的字符集,分别由下面几个参数控制:

        character_set_client:Server认为Client发送过来的请求是用该参数进行编码的,因此在收到请求后会使用该参数进行解码;

        character_set_connection:Server内部处理请求字符串时,会从character_set_client转为character_set_connection,因此两个参数要一致;

        character_set_results:Server返回查询结果给Client时,会根据character_set_results进行编码,然后再返回,因此也需要和character_set_client保持一致;

      开始修改:

      # 1、修改MySQL配置文件
      vi /etc/my.cnf
      # 在[mysqld]后添加
      character_set_server=utf8
      # 在[mysql]或[cilent]后添加
      default-character-set=utf8
      
      # 2、重启MySQL
      service mysqld restart
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

      修改成功后:

    在这里插入图片描述

    【注】第二种方法修改过后,之前创建的数据库和表都需要手动修改一下。之后编写Sqoop语句时就不需要额外写?useUnicode=true&characterEncoding=utf-8了。方便的话Hive也可以重新初始化一下(因为编码还是之前的,不知道如果不修改的话会不会有什么问题)。

  • 相关阅读:
    吉他&乐理
    golang上传文件到ftp服务器
    ICMP报文
    华为数据中心机房集成解决方案
    探讨下如何更好的使用缓存 —— 集中式缓存Redis的BitMap存储、管道与事务、以及与本地缓存一起构建多级缓存
    MSDC 4.3 接口规范(4)
    error response from daemon: unknown or invalid runtime name: docker-runc
    系统架构设计师学习笔记——软件架构设计_重点备忘录
    《LeetCode力扣练习》代码随想录——字符串(KMP算法学习补充——针对next数组构建的回退步骤进行解释)
    Kubernetes 网络排查方法
  • 原文地址:https://blog.csdn.net/qq_45634592/article/details/125447318