sqoop实例操作及详细参数解析

1、MySQL数据库中的数据导入到Hadoop的HDFS:
使用命令:

    $ sqoop import
    $ sqoop-import

示例:

$ sqoop import \
    --connect jdbc:mysql://localhost/userdb \
    --username root \
    --table emp \
    --m 1 \
    --target-dir /queryresult \
    --incremental append \
    --check-column id \
    -last value 1205 \
    --where “city =’sec-bad’” 

注释:

sqoop import \   sqoop导入命令
--connect jdbc:mysql://localhost/userdb \    连接mysql数据库表
--username root \    数据库账户名
--table emp \    数据库表
--m 1 \    开启map个数,即进程
--target-dir /queryresult \  导入目标地址(该目录下目标表不能存在)
--incremental append \    增量导入
--check-column id \    增量导入校验列
-last value 1205 \  从哪个值开始导入
--where “city =’sec-bad’” 条件

hive 导入的一些参数

  --hive-home   重写$HIVE_HOME
  --hive-import  插入数据到hive当中,使用hive的默认分隔符
  --hive-overwrite  重写插入
  --create-hive-table  建表,如果表已经存在,该操作会报错!
  --hive-table [table]  设置到hive当中的表名
  --hive-drop-import-delims  导入到hive时删除 \n, \r, and \01 
  --hive-delims-replacement  导入到hive时用自定义的字符替换掉
                              \n, \r, and \01 
  --hive-partition-key   hive分区的key
  --hive-partition-value hive分区的值
  --map-column-hive     类型匹配,sql类型对应到hive类型

将数据库中所有表导入HDFS:

$ sqoop import-all-table
$ sqoop-import-all-tables

示例:

$ sqoop import \
--connect jdbc:mysql://localhost/userdb \
--username root

注:如果使用的是import-all-tables,它是强制性的,在该数据库中的每个表必须有一个主键字段。

2、从HDFS导出到RDBMS数据库:
使用命令:

$ sqoop export
$ sqoop-export
示例:
$ sqoop export \
--connect jdbc:mysql://localhost/db \
--username root \
--table employee \ 
--export-dir /emp/emp_data

注释:

$ sqoop export \     sqoop导出数据命令
--connect jdbc:mysql://localhost/db \      连接数据库
--username root \     数据库账户
--table employee \    目标数据库表(类型一致,已创建)
--export-dir /emp/emp_data     导出路径

3、 创建Sqoop作业
使用命令:

$ sqoop job
$ sqoop-job

参数 说明
–create 生成一个job
–delete 删除一个jobsqoop job –delete myjob
–exec 执行一个jobsqoop job –exec myjob
–help 显示帮助说明
–list 显示所有的jobsqoop job –list
–meta-connect 用来连接metastore服务
–show 显示一个job的各种参数sqoop job –show myjob
–verbose 打印命令运行时的详细信息

4、创建作业(–create)

$ sqoop job --create myjob \
--import \
--connect jdbc:mysql://localhost/db \
--username root \
--table employee --m 1

作业方便复用,而且如果是增量计算的话,不用手动设置增量值(自动记忆)。
5、验证作业 (–list)
‘–list’ 参数是用来验证保存的作业。下面的命令用来验证保存Sqoop作业的列表。

$ sqoop job --list

它显示保存作业列表。
6、检查作业(–show)
‘–show’ 参数用于检查或验证特定的工作,及其详细信息。以下命令和样本输出用来验证一个名为myjob的作业。

$ sqoop job --show myjob

它显示工具和它们的选择,这是使用在myjob中作业情况。

7、执行作业 (–exec)
‘–exec’ 选项用于执行保存的作业。下面的命令用于执行保存的作业称为myjob。

$ sqoop job --exec myjob

8、Sqoop代码生成

$ sqoop codegen 
$ sqoop-codegen

示例:

$ sqoop codegen \
--connect jdbc:mysql://localhost/userdb \
--username root \ 
--table emp

这个命令会生成实现操作的java代码。

参数说明
–bindir 指定生成的java文件、编译成的class文件及将生成文件打包为JAR的JAR包文件输出路径
–class-name 设定生成的Java文件指定的名称
–outdir 生成的java文件存放路径
–package-name 包名,如cn.cnnic,则会生成cn和cnnic两级目录,生成的文件(如java文件)就存放在cnnic目录里
–input-null-non-string 在生成的java文件中,可以将null字符串设为想要设定的值(比如空字符串’’)
–input-null-string 同上,设定时,最好与上面的属性一起设置,且设置同样的值(比如空字符串等等)。
–map-column-java 数 据库字段在生成的java文件中会映射为各种属性,且默认的数据类型与数据库类型保持对应,比如数据库中某字段的类型为bigint,则在Java文件中 的数据类型为long型,通过这个属性,可以改变数据库字段在java中映射的数据类型,格式如:–map-column-java DB_ID=String,id=Integer
–null-non-string 在生成的java文件中,比如TBL_ID==null?”null”:””,通过这个属性设置可以将null字符串设置为其它值如ddd,TBL_ID==null?”ddd”:””
–null-string 同上,使用的时候最好和上面的属性一起用,且设置为相同的值
–table 对应关系数据库的表名,生成的java文件中的各属性与该表的各字段一一对应。

9、用户执行用户定义的查询

$ sqoop eval
$ sqoop-eval

示例:

$ sqoop eval \
--connect jdbc:mysql://localhost/db \
--username root \ 
--query “SELECT * FROM employee LIMIT 3”   支持自定义sql查询
-e “INSERT INTO employee VALUES(1207,‘Raju’,‘UI dev’,15000,‘TP’)”

–query与-e两个参数皆可运行自定义sql查询,如果命令成功执行,那么它会显示在控制台上更新的行的状态。

10、列出所有数据库/表

$ sqoop list-databases/list-tables
$ sqoop-list-databases/list-tables

11、merge

将HDFS中不同目录下面的数据合在一起,并存放在指定的目录中,示例如:

sqoop merge 
–new-data /test/p1/person 
–onto /test/p2/person 
–target-dir /test/merged 
–jar-file /opt/data/sqoop/person/Person.jar 
–class-name Person 
–merge-key id

其中,–class-name所指定的class名是对应于Person.jar中的Person类,而Person.jar是通过Codegen生成的

参数 说明
–new-data Hdfs中存放数据的一个目录,该目录中的数据是希望在合并后能优先保留的,原则上一般是存放越新数据的目录就对应这个参数。
–onto Hdfs中存放数据的一个目录,该目录中的数据是希望在合并后能被更新数据替换掉的,原则上一般是存放越旧数据的目录就对应这个参数。
–merge-key 合并键,一般是主键ID
–jar-file 合并时引入的jar包,该jar包是通过Codegen工具生成的jar包
–class-name 对应的表名或对象名,该class类是包含在jar包中的。
–target-dir 合并后的数据在HDFS里的存放目录

12、一些其他参数

Hive参数
参数 说明
–hive-delims-replacement 用自定义的字符串替换掉数据中的\n, \r, and \01等字符
–hive-drop-import-delims 在导入数据到hive中时,去掉数据中\n,\r和\01这样的字符
–map-column-hive 生成hive表时,可以更改生成字段的数据类型,格式如:–map-column-hiveTBL_ID=String,LAST_ACCESS_TIME=string
–hive-partition-key 创建分区,后面直接跟分区名即可,创建完毕后,通过describe 表名可以看到分区名,默认为string型
–hive-partition-value 该值是在导入数据到hive中时,与–hive-partition-key设定的key对应的value值。
–hive-home Hive的安装目录,可以通过该参数覆盖掉默认的hive目录
–hive-import 将数据从关系数据库中导入到hive表中
–hive-overwrite 覆盖掉在hive表中已经存在的数据
–create-hive-table 默认是false,如果目标表已经存在了,那么创建任务会失败
–hive-table 后面接要创建的hive表
–table 指定关系数据库表名
数据库连接参数
参数 说明
–connect Jdcb连接url,示例如:–connect jdbc:mysql://localhost:3306/hive
–connection-manager 指定要使用的连接管理类
–driver 数据库驱动类
–hadoop-home Hadoop根目录
–help 打印帮助信息
-P 从控制端读取密码
–password Jdbc url中的数据库连接密码
–username Jdbc url中的数据库连接用户名
–verbose 在控制台打印出详细信息
–connection-param-file 一个记录着数据库连接参数的文件

文件输出参数

用于import场景。 示例如:
sqoop import
–username root
–P
–table person
–split-by id
–check-column id
–incremental append
–last-value 1
–enclosed-by ‘\”‘
–escaped-by #
–fields-terminated-by .
参数 说明
–enclosed-by 给字段值前后加上指定的字符,比如双引号,示例:–enclosed-by ‘\”‘,显示例子:”3″,”jimsss”,”[email protected]
–escaped-by 给双引号作转义处理,如字段值为”测试”,经过–escaped-by \处理后,在hdfs中的显示值为:\”测试\”,对单引号无效
–fields-terminated-by 设定每个字段是以什么符号作为结束的,默认是逗号,也可以改为其它符号,如句号.,示例如:–fields-terminated-by.
–lines-terminated-by 设定每条记录行之间的分隔符,默认是换行,但也可以设定自己所需要的字符串,示例如:–lines-terminated-by ‘#’ 以#号分隔
–mysql-delimiters Mysql默认的分隔符设置,字段之间以,隔开,行之间以换行\n隔开,默认转义符号是\,字段值以单引号’包含起来。
–optionally-enclosed-by enclosed-by是强制给每个字段值前后都加上指定的符号,而–optionally-enclosed-by只是给带有双引号或单引号的字段值加上指定的符号,故叫可选的。示例如:–optionally-enclosed-by ‘ ”hehe”,测试$

文件输入参数

对数据格式的解析,用于export场景,与文件输出参数相对应。
示例如:
sqoop export –connect jdbc:mysql://localhost:3306/test –username root –password
123456 –table person2 –export-dir /user/hadoop/person –staging-table person3
–clear-staging-table –input-fields-terminated-by ‘,’
在hdfs中存在某一格式的数据,在将这样的数据导入到关系数据库中时,必须要按照该格式来解析出相应的字段值,比如在hdfs中有这样格式的数据:3,jimsss,[email protected],1,2013-08-07 16:00:48.0,”hehe”,测试
上面的各字段是以逗号分隔的,那么在解析时,必须要以逗号来解析出各字段值,如:–input-fields-terminated-by ‘,’
参数 说明
–input-enclosed-by 对字段值前后有指定的字符,比如双引号的值进行解析:–input-enclosed-by ‘\”‘,数据例子:”3″,”jimsss”,”[email protected]
–input-escaped-by 对含有转义双引号的字段值作转义处理,如字段值为\”测试\”,经过–input-escaped-by \处理后,解析得到的值为:”测试”,对单引号无效。
–input-fields-terminated-by 以字段间的分隔符来解析得到各字段值,示例如:– input-fields-terminated-by,
–input-lines-terminated-by 以每条记录行之间的分隔符来解析得到字段值,示例如:–input-lines-terminated-by ‘#’ 以#号分隔
–input-optionally-enclosed-by 与–input-enclosed-by功能相似,与–input-enclosed-by的区别参见输出参数中对–optionally-enclosed-by的描述

13、贡献几个实例
sqoop将mysql导入hive表create-hive-table,首先将关系数据库表的表结构对应的HIVE表

sqoop create-hive-tableconnect jdbc:mysql://localhost:3306/hive -username root -password 123456table TBLS –hive-table h_tbls2

参数 说明
–hive-home Hive的安装目录,可以通过该参数覆盖掉默认的hive目录
–hive-overwrite 覆盖掉在hive表中已经存在的数据
–create-hive-table 默认是false,如果目标表已经存在了,那么创建任务会失败
–hive-table 后面接要创建的hive表
–table 指定关系数据库表名

将数据库表的数据导入到hive中,如果在hive中没有对应的表,则自动生成与数据库表名相同的表。

sqoop import 
--connect jdbc:mysql://localhost:3306/hive 
--username root 
--password 123456
--table user 
--split-by id 
--hive-import

参数 说明
–append 将数据追加到hdfs中已经存在的dataset中。使用该参数,sqoop将把数据先导入到一个临时目录中,然后重新给文件命名到一个正式的目录中,以避免和该目录中已存在的文件重名。
–as-avrodatafile 将数据导入到一个Avro数据文件中
–as-sequencefile 将数据导入到一个sequence文件中
–as-textfile 将数据导入到一个普通文本文件中,生成该文本文件后,可以在hive中通过sql语句查询出结果。
–boundary-query 边 界查询,也就是在导入前先通过SQL查询得到一个结果集,然后导入的数据就是该结果集内的数据,格式如:–boundary-query ‘select id,creationdate from person where id = 3′,表示导入的数据为id=3的记录,或者select min(), max() from ,注意查询的字段中不能有数据类型为字符串的字段,否则会报错:java.sql.SQLException: Invalid value for getLong(),目前问题原因未知。
–columns 指定要导入的字段值,格式如:–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 person where $CONDITIONS ‘ –target-dir
/user/hive/warehouse/person –hive-table person

–split-by 表的列名,用来切分工作单元,一般后面跟主键ID
–table 关系数据库表名,数据从该表中获取
–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将被使用

增量导入参数 说明

–check-column (col) 用来作为判断的列名,如id –incremental
(mode) append:追加,比如对大于last-value指定的值之后的记录进行追加导入。lastmodified:最后的修改时间,追加last-value指定的日期之后的记录
–last-value (value) 指定自从上次导入后列的最大值(大于该指定的值),也可以自己设定某一值。
–split-by指定数据库表中的主键字段名,在这里为id。

将hive数据导出到mysql表:

sqoop eval 
--connect 'jdbc:mysql://localhost:3306/data_analyses?useUnicode=true&characterEncoding=utf-8' 
--username data  
--password x8
--query "delete from d_compete_run_time_statistic"

sqoop export --connect 'jdbc:mysql://localhost:3306/data_analyses?useUnicode=true&characterEncoding=utf-8' 
--username data  
--password x8 
--table d_compete_run_time_statistic 
--export-dir /user/hive/warehouse/dm.db/d_compete_run_time_statistic --input-fields-terminated-by '\t' --input-null-string '\\N' --input-null-non-string '\\N'

参考文档:
sqoop学习笔记
Sqoop教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章