sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。

sqoop就是一款数据导入导出工具,底层 将 导入导出命令翻译成MR任务, 执行在YARN平台上, 底层是对MR的输入和输出做了定制化操作
        

导入: 从RDBMS 到 hadoop生态圈的过程
导出: 从hadoop生态圈 到 RDBMS

 

sqoop的使用方式主要有二种: 原生API  和 hcatalog  API


导入到HDFS 采用的原生API 

导入到hive 做增量导入, 一般使用hcatalog

原生API和 hcatalog的区别: 
            1、支持数据类型不同, hcatalog支持数据类型更多, 而原生仅仅支持普通文本
            2、原生API 进行数据覆盖, 而hbcatalog是数据追加
            3、hcatalog要求字段的名称都得对应一致, 而原生API, 不需要, 但是需要保证
                字段个数一致

 

 

sqoop的命令: 


        列出主机所有的数据库
            sqoop list-databases \
            --connect jdbc:mysql://192.168.52.150:3306/ \
            --username root --password 123456

        查看某一个数据库下面的所有数据表
            sqoop list-tables \
            --connect jdbc:mysql://192.168.52.150:3306/hive \
            --username root --password 123456

 

将MySQL中某个表数据导入到HDFS中 :  全量导入
            sqoop import \
            --connect jdbc:mysql://192.168.52.150:3306/test \
            --password 123456 --username root \
            --table emp \
            --m 1

            注意: 如果没有指定目的地目录, 此时默认情况下导入到hdfs当前用户的家目录下, 数据中字段与字段的分隔符号为 逗号

            导入到指定的目录下: 
            
            sqoop import  \
            --connect jdbc:mysql://192.168.52.150:3306/test \
            --username root --password 123456 \
            --table emp  \
            --delete-target-dir \
            --target-dir /sqoop/emp \
            --m 1 


            属性说明: 
                --target-dir 指定目标目录 
                --delete-target-dir : 如果目标目录以存在, 先进行删除
                --fields-terminated-by: 指定字段与字段之间的分隔符号
            指定分隔符号并且指定了目标目录: 
            sqoop import  \
            --connect jdbc:mysql://192.168.52.150:3306/test \
            --username root --password 123456 \
            --table emp \
            --delete-target-dir \
            --target-dir /sqoop/emp2 \
            --fields-terminated-by '\t' \
            --m 1 

        将MySQL的数据导入的hive中:  全量导入
            第一步: 准备hive数据库及其hive的表
                create database sqooptohive;
                create table sqooptohive.emp_hive(
                    id int,
                    name string,
                    deg string,
                    salary int ,
                    dept string
                ) row format delimited fields terminated by '\t' stored as orc;

            第二步: 通过sqoop 实施导入操作: 
                sqoop import \
                --connect jdbc:mysql://192.168.52.150:3306/test \
                --username root \
                --password 123456 \
                --table emp \
                --fields-terminated-by '\t' \
                --hcatalog-database sqooptohive \
                --hcatalog-table emp_hive \
                -m 1
            第三步: 到hive的表中查看 是否已经将数据导入成功了
                select  * from sqooptohive.emp_hive;

            注意: 如果使用上述的sqoop导入到hive中, 要求在hive中先创建对应库和对应表


        将MySQL中部分数据导入到HDFS:   
            第一种方式: 基于where 子句方式 导入
            sqoop import \
            --connect jdbc:mysql://192.168.52.150:3306/test \
            --username root --password 123456 \
            --table emp_add \
            --where "city = 'sec-bad'" \
            --delete-target-dir \
            --target-dir /sqoop/emp_add \
            -m 1  

            第二种方式: 通过 SQL语句的方式 实现数据导入操作
            sqoop import \
            --connect jdbc:mysql://192.168.52.150:3306/test \
            --username root --password 123456 \
            --query 'select phno from emp_conn where 1=1 and  $CONDITIONS' \
            --delete-target-dir -m 1 \
            --target-dir /sqoop/emp_conn
    
            注意事项:
                使用sql语句来进行查找时不能加参数 --table 
                并且必须要添加where条件,
                并且where条件后面必须带一个$CONDITIONS 这个字符串,
                并且这个sql语句如果使用双引号,则要修改为\$CONDITIONS

        将MySQL中部分数据导入到HIVE: 增量导入
            sqoop import \
            --connect jdbc:mysql://192.168.52.150:3306/test \
            --username root --password 123456 \
            --query "select * from emp where id>1203 and  \$CONDITIONS" \
            --fields-terminated-by '\t' \
            --hcatalog-database sqooptohive \
            --hcatalog-table emp_hive \
            -m 1 \
        
        如何将hive数据导出到MySQL中: 
            1) 在MySQL中创建目标表: 
                CREATE TABLE `emp_out` (
                  `id` INT(11) DEFAULT NULL,
                  `name` VARCHAR(100) DEFAULT NULL,
                  `deg` VARCHAR(100) DEFAULT NULL,
                  `salary` INT(11) DEFAULT NULL,
                  `dept` VARCHAR(10) DEFAULT NULL
                ) ENGINE=INNODB DEFAULT CHARSET=utf8;

            2) 指定导出命令:
                sqoop export \
                --connect jdbc:mysql://192.168.52.150:3306/test \
                --username root --password 123456 \
                --table emp_out \
                --hcatalog-database sqooptohive \
                --hcatalog-table emp_hive \
                -m 1
            3) 在MySQL中查看是否有数据
    
                        
            参数                                              说明
            --connect                                   连接关系型数据库的URL
            --username                                   连接数据库的用户名
            --password                                   连接数据库的密码
            --driver                                    JDBC的driver class
            --query或--e <statement>                   将查询结果的数据导入,使用时必须伴随参--target-dir,--hcatalog-table,如果查询中有where条件,则条件后必须加上$CONDITIONS关键字。
                                                        如果使用双引号包含sql,则$CONDITIONS前要加上\以完成转义:\$CONDITIONS
            --hcatalog-database                        指定HCatalog表的数据库名称。如果未指定,default则使用默认数据库名称。提供 --hcatalog-database不带选项--hcatalog-table是错误的。
            --hcatalog-table                            此选项的参数值为HCatalog表名。该--hcatalog-table选项的存在表示导入或导出作业是使用HCatalog表完成的,并且是HCatalog作业的必需选项。
            --create-hcatalog-table                      此选项指定在导入数据时是否应 自动创建HCatalog表。表名将与转换为小写的数据库表名相同。
            --hcatalog-storage-stanza 'stored as orc tblproperties ("orc.compress"="SNAPPY")' \      建表时追加存储格式到建表语句中,tblproperties修改表的属性,这里设置orc的压缩格式为SNAPPY
            -m                                          指定并行处理的MapReduce任务数量。
                                                      -m不为1时,需要用split-by指定分片字段进行并行导入,尽量指定int型。
            --split-by id                             如果指定--split by, 必须使用$CONDITIONS关键字, 双引号的查询语句还要加\
            --hcatalog-partition-keys
            --hcatalog-partition-values                 keys和values必须同时存在,相当于指定静态分区。允许将多个键和值提供为静态分区键。多个选项值之间用,(逗号)分隔。比如:
                                                     --hcatalog-partition-keys year,month,day
                                                     --hcatalog-partition-values 1999,12,31
            --null-string '\\N'
            --null-non-string '\\N'                    指定mysql数据为空值时用什么符号存储,null-string针对string类型的NULL值处理,--null-non-string针对非string类型的NULL值处理
            --hive-drop-import-delims                设置无视字符串中的分割符(hcatalog默认开启)
            --fields-terminated-by '\t'                设置字段分隔符

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐