Sqoop导入导出操作及参数配置

文章目录

      • 简介
      • 全量导入
      • 增量导入
      • 默认模式导出
      • 更新导出

简介

  1. sqoop就是一个能够在 关系型数据库 和 hadoop 之间实现数据导入导出的工具,关系型数据库数据迁移到hadoop的称为导入,反之为导出。

  2. sqoop底层执行的是 mapreduce中的 mapTask,这是因为它实现数据的迁移,不涉及数据的聚合操作。在导入数据时,mapreduce 程序读取 数据库数据使用 DBinputFormat 来实现。在导出数据时,mapreduce 程序将数据写到数据库,使用 DBoutputFormat 来实现。

  3. sqoop的安装步骤包含了(只是一个工具,学习时最好三台机器都安装):

    1. 下载解压,修改 sqoop-env.sh 配置文件。
    2. 添加 jdbc 驱动包 到 sqoop的 lib 文件夹下。
    3. 添加环境变量。
    4. 执行 sqoop-version 验证安装结果。
  4. sqoop帮助文档:

    sqoop help
    sqoop list-databases --help
    sqoop list-tables --help
    	Common arguments:常见的连接关系数据库属性
    
  5. sqoop 安装验证

    bin/sqoop list-databases \
    --connect jdbc:mysql://localhost:3306/ \
    --username root --password hadoop
    

注意事项:命令携带参数必须出现在一行中,若换行就意味着自动提交执行,可通过\表示未结束。

全量导入

  • 全量导入数据到hdfs

    • --connect --username --password 指定连接的数据库,账号和密码,mysql的地址尽量不要使用localhost 请使用ip或者host。

    • --table 指定的是要导入的数据库表。

    • --target-dir 指定导入的HDFS路径,--delete-target-dir 如目录存在则删除。

    • --fields-terminated-by '\t' ,指定HDFS数据字段间的分隔符,默认分隔符是逗号。

    • --m 1 如果表的数据比较多,可以指定mapTask个数,如果值大于1且表没有主键就要指定 --split-by 字段名 进行切分。

      bin/sqoop import \
      --connect jdbc:mysql://node-1:3306/userdb \
      --username root \
      --password hadoop \
      --target-dir /sqoopresult214 \
      --fields-terminated-by '\t' \
      --split-by id \
      --table emp --m 2
      
  • 全量导入到Hive:

    • --hive-overwrite 覆盖Hive表数据

    • --hive-table test.emp_add_sp 如指定hive表,则表必须存在(这个指的是执行sqoop import语句的时候),如果不指定,默认会自动创建hive表

    • --hive-database test 指定Hive数据库

  • 导入表数据子集(where/query查询)

    • --where 后面添加过滤条件 来控制导入需要的数据

      bin/sqoop import \
      --connect jdbc:mysql://node03:3306/userdb \
      --username root \
      --password root \
      --where "city ='sec-bad'" \
      --target-dir /wherequery \
      --table emp_add \
      --m 1
      
    • --query 添加query sql 语句来进行查找

      • 不能加参数–table ;
      • 必须要添加 where 条件,并且 where 条件后面必须带一个$CONDITIONS 这个字符串;
      • 这个 sql 语句必须用单引号,不能用双引号;
      bin/sqoop import \
      --connect jdbc:mysql://node03:3306/userdb \
      --username root \
      --password root \
      --target-dir /wherequery12 \
      --query 'select id,name,deg from emp WHERE  id>1203 and $CONDITIONS' \
      --split-by id \
      --fields-terminated-by '\001' \
      --m 2
      

增量导入

  • 增量数据的导入:所谓的增量数据指的是上次至今中间新增加的数据

  • sqoop支持两种模式的增量导入:append和lastmodified

    • --incremental append 表示使用追加导入模式append,根据数值类型字段进行追加导入大于指定的last-value

      • --check-column id--last-value 1205 表示上一次导入到关系型数据库的最后一条数据是id为1205的数据,现在从1205后面(不含1205)开始导入。注意:检查的字段必须是int类型。
      bin/sqoop import \
      --connect jdbc:mysql://node03:3306/userdb \
      --username root \
      --password root \
      --table emp --m 1 \
      --target-dir /appendresult \
      --incremental append \
      --check-column id \
      --last-value 1205
      
    • --incremental lastmodified根据时间戳类型字段进行追加大于等于指定的last-value

      • 注意在lastmodified 模式下还分为两种情形:append和merge-key

      • --append 只会追加增量数据到一个新的文件中 并且会产生数据的重复问题,因为默认是从指定的last-value 大于等于其值的数据开始导入

        bin/sqoop import \
        --connect jdbc:mysql://node03:3306/userdb \
        --username root \
        --password root \
        --table customertest \
        --target-dir /lastmodifiedresult \
        --check-column last_mod \
        --incremental lastmodified \
        --last-value "2019-06-05 15:52:58" \
        --m 1 \
        --append
        
      • --merge-key 把增量的数据合并到一个文件中,处理追加增量数据之外,如果之前的数据有变化修改,也可以进行修改操作,底层相当于进行了一次完整的mr作业。数据不会重复

        bin/sqoop import \
        --connect jdbc:mysql://node03:3306/userdb \
        --username root \
        --password root \
        --table customertest \
        --target-dir /lastmodifiedresult \
        --check-column last_mod \
        --incremental lastmodified \
        --last-value "2019-06-05 15:52:58" \
        --m 1 \
        --merge-key id 
        

默认模式导出

  • 数据导出操作

    • 注意:导出的目标表需要自己手动提前创建,也就是sqoop并不会帮我们创建复制表结构

    • 默认情况下,就是将数据从HDFS一条条插入到关系型数据库中

    • --input-fields-terminated-by如果HDFS上的数据字段之间分隔符是逗号,则可以直接导出,如果分隔符是其他类型,则需要通过这条语句指定。

    • --columns 如果导出的数据字段与关系型数据库中的字段排序不匹配,则需要指定HDFS上字段名顺序。

    • 为了防止HDFS上有些数据为空,导致插入到关系型数据库字段出现NULL,我们可以将NULL值进行替换,通过 --input-null-string \N(空字符串类型) --input-null-non-string \N (空的非字符串类型)可以实现。

      bin/sqoop export \
      --connect jdbc:mysql://node03:3306/userdb \
      --username root \
      --password root \
      --table employee1 \
      --columns id,name,deg,salary,dept \
      --export-dir /emp_data/
      

更新导出

  • updateonly 只更新已经存在的数据 不会执行insert增加新的数据

    • -- updatemod updateonly 表示只导出更新的数据。

    • --update-key id 更新标识,即根据某个字段进行更新,多个字段用逗号分隔。这里只会对相同id的数据做检查是否更新,新插入的id不做更新。

      bin/sqoop export \
      --connect jdbc:mysql://node03:3306/userdb \
      --username root \
      --password root \
      --table updateonly \
      --export-dir /updateonly_2/ \
      --update-key id \
      --update-mode updateonly
      
  • allowinsert 更新已有的数据,并且插入新的数据,底层相当于insert&update

    • -- updatemod allowinsert 表示既导出更新的数据又导出新增的数据。

    • --update-key id 更新标识,即根据某个字段进行更新,多个字段用逗号分隔。这里如果导出数据的id与之前的id相同,则判断是否需要更新,如果之前的数据没有该id,则新增导出。。注意:检查的字段必须是主键或联合主键。

      bin/sqoop export \
      --connect jdbc:mysql://node03:3306/userdb \
      --username root \
      --password root \
      --table allowinsert \
      --export-dir /allowinsert_2/ \
      --update-key id \
      --update-mode allowinsert
      

你可能感兴趣的:(Sqoop导入导出操作及参数配置)