美文网首页
Sqoop采集数据格式问题+Avro格式

Sqoop采集数据格式问题+Avro格式

作者: Eqo | 来源:发表于2022-06-24 21:33 被阅读0次

    背景

    使用Sqoop采集完成后导致HDFS数据与Oracle数据量不符

    原因分析

    • sqoop以文本格式TextFile导入数据时,默认的换行符是特殊字符
    • Oracle中的数据列中如果出现了\n、\r、\t等特殊字符,就会被划分为多行
      举例
      Oracle
    id      name        age
    1       lao da      20
    2       lao\ner     22
    

    hdfs

    1       lao da      20
    2       lao
    er      22
    

    解决方案

    方案一 删除或者替换数据中的换行符【数据被侵入】

    • hive-drop-import-delims:删除换行符
    • hive-delims-replacement char:替换换行符
      注 此种方法慎用,会修改掉数据内容,改变数据

    方案二 不使用textfile 格式进行存储 使用orc /Avro格式进行存储

    orc格式的压缩比是最高的
    单我们采用Avro 格式

    Avro 格式 简介

    Avro 格式 类似于表格文件,不光可以解决sqoop导入的问题,也可以帮助我们更方便实现自动化建表.

    因为avro 格式进行存储的时候,会在本地存储一份 表数据的Schema信息 包括 表的字段,数据类型等,我们可以通过这个schema信息 实现自动化建表

    优点

    • 二进制数据存储,性能好、效率高

    • 使用JSON描述模式,支持场景更丰富

    • Schema和数据统一存储,消息自描述:把Avro格式的文件当做表来看

    • 模式定义允许定义数据的排序

    • 缺点

      • 只支持Avro自己的序列化格式

      • 少量列的读取性能比较差,压缩比较低
        适用场景:基于行的大规模结构化数据写入、列的读取非常多或者Schema变更操作比较频繁的场景

    测试

    --as-avrodatafile Imports data to Avro datafiles

    sqoop import \
    -Dmapreduce.job.user.classpath.first=true \
    --connect jdbc:oracle:thin:@oracle.bigdata.cn:1521:helowin \
    --username ciss \
    --password 123456 \
    --table CISS4.CISS_SERVICE_WORKORDER \
    --delete-target-dir \
    --target-dir /test/full_imp/ciss4.ciss_service_workorder \
    --as-avrodatafile \
    --fields-terminated-by "\001" \
    -m 1
    

    相关文章

      网友评论

          本文标题:Sqoop采集数据格式问题+Avro格式

          本文链接:https://www.haomeiwen.com/subject/wufwvrtx.html