sqoop是一个用于在Hadoop和关系型数据库(Oracle,mysql...)间数据传递的开源工具。下面以mysql、sqlserver为例,介绍使用sqoop将数据从mysql、sqlserver导入到Hadoop中(HDFS、Hive)
#导入命令及参数介绍
通用参数
参数名 |
参数说明 |
--connect <jdbc-uri> | JDBC连接字符串 |
--username <username> | 数据库用户名 |
--password <password> | 数据库密码 |
-P | 导入时,从控制台获取数据库密码 |
--password-file | 从指定的文件中获取数据库密码 |
--verbose | 导入时,输出更多的日志信息 |
控制参数
参数 | 说明 |
---|---|
–append | 将数据追加到hdfs中已经存在的dataset中。使用该参数,sqoop将把数据先导入到一个临时目录中,然后重新给文件命名到一个正式的目录中,以避免和该目录中已存在的文件重名。 |
–as-avrodatafile | 将数据导入到一个Avro数据文件中 |
–as-sequencefile | 将数据导入到一个sequence文件中 |
–as-textfile | 将数据导入到一个普通文本文件中,生成该文本文件后,可以在hive中通过sql语句查询出结果。 |
–boundary-query | 边界查询,也就是在导入前先通过SQL查询得到一个结果集,然后导入的数据就是该结果集内的数据,格式如:–boundary-query ‘select id,no from t where id = 3’,表示导入的数据为id=3的记录,或者 select min(), max() from ,注意查询的字段中不能有数据类型为字符串的字段,否则会报错 |
–columns<col,col> | 指定要导入的字段值,格式如:–columns id,username |
–direct | 直接导入模式,使用的是关系数据库自带的导入导出工具。官网上是说这样导入会更快 |
–direct-split-size | 在使用上面direct直接导入的基础上,对导入的流按字节数分块,特别是使用直连模式从PostgreSQL导入数据的时候,可以将一个到达设定大小的文件分为几个独立的文件。 |
–inline-lob-limit | 设定大对象数据类型的最大值 |
-m,–num-mappers | 启动N个map来并行导入数据,默认是4个,最好不要将数字设置为高于集群的节点数 |
–query,-e | 从查询结果中导入数据,该参数使用时必须指定–target-dir、–hive-table,在查询语句中一定要有where条件且在where条件中需要包含 \$CONDITIONS,示例:–query ‘select * from t where \$CONDITIONS ‘ –target-dir /tmp/t –hive-table t |
–split-by | 表的列名,用来切分工作单元,一般后面跟主键ID |
–table | 关系数据库表名,数据从该表中获取 |
–delete-target-dir | 删除目标目录 |
–target-dir |
指定hdfs路径 |
–warehouse-dir |
与 –target-dir 不能同时使用,指定数据导入的存放目录,适用于hdfs导入,不适合导入hive目录 |
–where | 从关系数据库导入数据时的查询条件,示例:–where “id = 2” |
-z,–compress | 压缩参数,默认情况下数据是没被压缩的,通过该参数可以使用gzip压缩算法对数据进行压缩,适用于SequenceFile, text文本文件, 和Avro文件 |
–compression-codec | Hadoop压缩编码,默认是gzip |
–null-string | 可选参数,如果没有指定,则字符串null将被使用 |
–null-non-string | 可选参数,如果没有指定,则字符串null将被使用 |
--fields-terminated-by | 自定义行分隔符 |
--lines-terminated-by | 自定义列分割符 |
--hive-drop-import-delims | 把导入数据中包含的hive默认的分隔符去掉 |
##导入数据到HDFS
##Mysql作为元数据
$ sqoop import --connect jdbc:mysql://IP:PORT/ --username USER --password ‘PASSWD‘ --table T_SQOOP_TEST --where "$conditions" --target-dir ‘mydir‘ --delete-target-dir
##SqlServer作为元数据
$ sqoop import --connect ‘jdbc:sqlserver://IP:1433;username=NAME;password=PWD;database=DataName‘ --table T_SQOOP_TEST --where “$conditions” --target-dir ‘mydir‘ --delete-target-dir
###导入到hive
在导入命令中添加--hive-import参数则将数据导入到hive中。
$ sqoop import --hive-import --connect jdbc:mysql://IP:PORT/ --username USER --password ‘PASSWD‘ --table T_SQOOP_TEST --m 1--target-dir ‘mydir‘ --delete-target-dir
参数说明:
参数名 |
参数说明 |
--hive-import | 数据导入到Hive |
--hive-overwrite | 覆盖Hive表中已存在的数据 |
--create-hive-table | 设置了此参数,导入时如果hive中表已经存在,则导入任务失败。默认为false |
--hive-table <table-name> | 指定导入到Hive中的表名 |
--hive-drop-import-delims | 导入Hive时,去除字符型字段中的\n(换行符),\r(回车符)和\01(标题开始符)字符。 |
--hive-delims-replacement | 导入Hive时,用用户定义的字符串替换字符型字段中的\n,\r和\01字符。 |
导入时需要注意:
1)Hive默认使用\01字符作为列分隔符(字段分隔符),\n和\r作为行分隔符。因此,如果导入的字符型字段的数据中包含这些字符时,就会有问题。
如:T_SQOOP_TEST表ID为2的行,NAME字段值中包含换行符,导入到Hive中,数据出现异常:
可以使用--hive-drop-import-delims参数,将导入数据中的\n,\r,\01字符去掉。也可以使用--hive-delims-replacement替换\n,\r和\01。