• 使用Sqoop,最终导入到hive中的数据和原数据库中数据不一致解决办法


            Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

    1.问题背景

      使用Sqoop把oracle数据库中的一张表,这里假定为student,当中的数据导入到hdfs中,然后再创建hive的external表,location到刚才保存到hdfs中数据的位置。最后发现对hive中表特定条件进行count时结果和oracle中结果不一致。

    1.1 导入数据到hdfs中/user/hadoop/student路径下     

    sqoop import --connect "jdbc:oracle:thin:@//localhost:1521/student" --password "***" --username "***" --query "select * from student where name='zhangsan' and class_id='003' and $CONDITIONS" --target-dir "/user/hadoop/student" --verbose -m 1

    这个时候hdfs上/user/hadoop/student下就保存了从oracle上导入的表数据。

    表数据在hdfs上是如何存储的呢?注意这一点,造成了最后产生结果不一致的错误。

    我们来看一看在hdfs上数据是如何存储的。我们运行hadoop fs -cat /user/hadoop/student/part-m-00000,可以看到原来字段与字段之间都用‘,’分隔开,这是sqoop默认的,这时候,如果一个字段值当中包含‘,’,再向hive中插入数据时分隔就会出错。因为hive也是用‘,’分隔的。

    2.分析问题

      对hive中表select count(*) from student的结果和oracle中select count(*) from studeng的结果进行比较,发现条数是一样的,说明没有少load数据。那为什么对特定条件结果就会不一致,而且hive中条数比oracle中少。也就是同时运行select count(*) from student where class_id='003'

      最后,发现hive用逗号分隔数据时,有几条数据字段内值包含有逗号,所以字段与值对应起来就乱套了,所以得不到正确结果。

    我们建议用‘01'来进行sqoop 导入数据时的 分割。也就是--fields-terminated-by <char>参数。参考:http://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html#_large_objects

    最后优化后的sqoop语句为:

    sqoop import --connect "jdbc:oracle:thin:@//localhost:1521/student" --password "***" --username "***" --query "select * from student where name='zhangsan' and class_id='003' and $CONDITIONS" --target-dir "/user/hadoop/student" --fields-terminated-by "01" --verbose -m 1

     
  • 相关阅读:
    Taro、小程序使用定位服务
    Taro项目中设置了设计稿尺寸为375,taro-ui的样式会被放大
    Taro 页面返回携带参数
    Taro + TS 项目取别名配置 alias
    安卓APP 错误:net::ERR_CLEARTEXT_NOT_PERMITTED解决方法
    Springboot定时发送邮件,并附带Excel文件和PDF文件
    通过openssl导入证书到系统证书目录解决安卓7以上系统无法抓包问题
    CentOS 7 安装配置SVN服务器
    解决安装 Docker 慢:使用国内阿里云镜像加速安装
    Redis实战篇(四)基于GEO实现查找附近的人功能
  • 原文地址:https://www.cnblogs.com/zdfjf/p/5277597.html
Copyright © 2020-2023  润新知