sqoop指定多个字段导⼊类型
–map-column-hive <arg>⽣成hive表时,可以更改⽣成字段的数据类型,格式如:–map-column-
hiveTBL_ID=String,LAST_ACCESS_TIME=string
Sqoop中⽂⼿册
8,038浏览
⼦猴:Sqoop在我们的实际⼯作中有⼀些应⽤,为了对Sqoop的使⽤有个更全⾯的了解,于是我花了⼀些时间将Sqoop的使⽤整理成了⼀份中⽂⼿册,我⾃认还是⾮常全⾯的,覆盖到了Sqoop所有的⽅⾯。虽然对每⼀个⽤法,我都是尽可能地先经过测试然后再得出结论,但可能难免会有谬误,不过总的来说希望能对使⽤Sqoop的朋友有点帮助吧。
1. 概述
本⽂档主要对SQOOP的使⽤进⾏了说明,参考内容主要来⾃于Cloudera SQOOP的官⽅⽂档。为了⽤中⽂更清楚明⽩地描述各参数的使⽤含义,本⽂档⼏乎所有参数使⽤说明都经过了我的实际验证⽽得到。
2. codegen
将关系数据库表映射为⼀个java⽂件、java class类、以及相关的jar包,作⽤主要是两⽅⾯:
1、将数据库表映射为⼀个Java⽂件,在该Java⽂件中对应有表的各个字段。
2、⽣成的Jar和class⽂件在metastore功能使⽤时会⽤到。
基础语句:
sqoop codegen –connect jdbc:mysql://localhost:3306/hive –username root –password 123456 –table TBLS2
参数说明
–bindir <dir>指定⽣成的java⽂件、编译成的class⽂件及将⽣成⽂件打包为JAR的JAR包⽂件输出路径
–class-name <name>设定⽣成的Java⽂件指定的名称
–outdir <dir>⽣成的java⽂件存放路径
–package-name<name>包名,如cnnic,则会⽣成cn和cnnic两级⽬录,⽣成的⽂件(如java⽂件)就存放在cnnic⽬录⾥–input-null-non-string<null-str>在⽣成的java⽂件中,可以将null字符串设为想要设定的值(⽐如空字符串’’)
–input-null-string<null-str>同上,设定时,最好与上⾯的属性⼀起设置,且设置同样的值(⽐如空字符串等等)。
–map-column-java<arg>数据库字段在⽣成的java⽂件中会映射为各种属性,且默认的数据类型与数据库类型保持对应,⽐如
数据库中某字段的类型为bigint,则在Java⽂件中的数据类型为long型,通过这个属性,可以改变数
据库字段在java中映射的数据类型,格式如:–map-column-java DB_ID=String,id=Integer
–null-non-string<null-str>在⽣成的java⽂件中,⽐如TBL_ID==null?”null”:””,通过这个属性设置可以将null字符串设置为其它
值如ddd,TBL_ID==null?”ddd”:””
–null-string<null-str>同上,使⽤的时候最好和上⾯的属性⼀起⽤,且设置为相同的值
–table <table-name>对应关系数据库的表名,⽣成的java⽂件中的各属性与该表的各字段⼀⼀对应。
3. create-hive-table
⽣成与关系数据库表的表结构对应的HIVE表
基础语句:
sqoop create-hive-table –connect jdbc:mysql://localhost:3306/hive -username root -password 123456 –table TBLS –hive-table h_tbls2
参数说明
–hive-home <dir>Hive的安装⽬录,可以通过该参数覆盖掉默认的hive⽬录
–hive-overwrite覆盖掉在hive表中已经存在的数据
–create-hive-table默认是false,如果⽬标表已经存在了,那么创建任务会失败
–hive-table后⾯接要创建的hive表
–hive-table后⾯接要创建的hive表
–table指定关系数据库表名
4. eval
可以快速地使⽤SQL语句对关系数据库进⾏操作,这可以使得在使⽤import这种⼯具进⾏数据导⼊的时候,可以预先了解相关的SQL语句是否正确,并能将结果显⽰在控制台。
查询⽰例:
sqoop eval –connect jdbc:mysql://localhost:3306/hive -username root -password 123456 -query “SELECT * FROM tbls LIMIT 10″
数据插⼊⽰例:
sqoop eval –connect jdbc:mysql://localhost:3306/hive -username root -password 123456 -e “INSERT INTO TBLS2
VALUES(100,1375170308,1,0,’hadoop’,0,1,’guest’,’MANAGED_TABLE’,’abc’,’ddd’)”
-e、-query这两个参数经过测试,⽐如后⾯分别接查询和插⼊SQL语句,皆可运⾏⽆误,如上。
5. export
从hdfs中导数据到关系数据库中
sqoop export –connect jdbc:mysql://localhost:3306/hive –username root –password
123456 –table TBLS2 –export-dir sqoop/test
参数说明
–direct快速模式,利⽤了数据库的导⼊⼯具,如mysql的mysqlimport,可以⽐jdbc连接的⽅式更为⾼效
的将数据导⼊到关系数据库中。
–export-dir <dir>存放数据的HDFS的源⽬录
-m,–num-mappers <n>启动N个map来并⾏导⼊数据,默认是4个,最好不要将数字设置为⾼于集的最⼤Map数
–table <table-name>要导⼊到的关系数据库表
–update-key <col-name>后⾯接条件列名,通过该参数,可以将关系数据库中已经存在的数据进⾏更新操作,类似于关系
数据库中的update操作
–update-mode <mode>更新模式,有两个值updateonly和默认的allowinsert,该参数只能是在关系数据表⾥不存在要导⼊
的记录时才能使⽤,⽐如要导⼊的hdfs中有⼀条id=1的记录,如果在表⾥已经有⼀条记录id=2,那
么更新会失败。
–input-null-string <null-string>可选参数,如果没有指定,则字符串null将被使⽤
–input-null-non-string <null-string>可选参数,如果没有指定,则字符串null将被使⽤
–staging-table <staging-table-name>该参数是⽤来保证在数据导⼊关系数据库表的过程中事务安全性的,因为在导⼊的过程中可能会
有多个事务,那么⼀个事务失败会影响到其它事务,⽐如导⼊的数据会出现错误或出现重复的记
录等等情况,那么通过该参数可以避免这种情况。创建⼀个与导⼊⽬标表同样的数据结构,保留
该表为空在运⾏数据导⼊前,所有事务会将结果先存放在该表中,然后最后由该表通过⼀次事务
将结果写⼊到⽬标表中。
–clear-staging-table如果该staging-table⾮空,则通过该参数可以在运⾏导⼊前清除staging-table⾥的数据。
–batch该模式⽤于执⾏基本语句(暂时还不太清楚含义)
6. import
将数据库表的数据导⼊到hive中,如果在hive中没有对应的表,则⾃动⽣成与数据库表名相同的表。
sqoop import –connect jdbc:mysql://localhost:3306/hive –username root –password
123456 –table user –split-by id –hive-import
–split-by指定数据库表中的主键字段名,在这⾥为id。
参数说明
–append将数据追加到hdfs中已经存在的dataset中。使⽤该参数,sqoop将把数据先导⼊到⼀个临时⽬录
中,然后重新给⽂件命名到⼀个正式的⽬录中,以避免和该⽬录中已存在的⽂件重名。
–as-avrodatafile将数据导⼊到⼀个Avro数据⽂件中
–as-sequencefile将数据导⼊到⼀个sequence⽂件中
–as-textfile将数据导⼊到⼀个普通⽂本⽂件中,⽣成该⽂本⽂件后,可以在hive中通过sql语句查询出结果。
–boundary-query <statement>边界查询,也就是在导⼊前先通过SQL查询得到⼀个结果集,然后导⼊的数据就是该结果集内的数
据,格式如:–boundary-query ‘select id,creationdate from person where id = 3’,表⽰导⼊的数据
为id=3的记录,或者select min(<split-by>), max(<split-by>) from <table name>,注意查询的字段
中不能有数据类型为字符串的字段,否则会报错:java.sql.SQLException: Invalid value for
getLong()
⽬前问题原因还未知
–columns<col,col,col…>指定要导⼊的字段值,格式如:–columns id,username
–direct直接导⼊模式,使⽤的是关系数据库⾃带的导⼊导出⼯具。官⽹上是说这样导⼊会更快
–direct-split-size在使⽤上⾯direct直接导⼊的基础上,对导⼊的流按字节数分块,特别是使⽤直连模式从
PostgreSQL导⼊数据的时候,可以将⼀个到达设定⼤⼩的⽂件分为⼏个独⽴的⽂件。
–inline-lob-limit设定⼤对象数据类型的最⼤值
-m,–num-mappers启动N个map来并⾏导⼊数据,默认是4个,最好不要将数字设置为⾼于集的节点数
–query,-e<statement>从查询结果中导⼊数据,该参数使⽤时必须指定–target-dir、–hive-table,在查询语句中⼀定要有
where条件且在where条件中需要包含$CONDITIONS,⽰例:–query ‘select * from person where
$CONDITIONS ‘ –target-dir
/user/hive/warehouse/person –hive-table person
–split-by<column-name>表的列名,⽤来切分⼯作单元,⼀般后⾯跟主键ID
–table <table-name>关系数据库表名,数据从该表中获取
–target-dir <dir>指定hdfs路径
–warehouse-dir <dir>与–target-dir不能同时使⽤,指定数据导⼊的存放⽬录,适⽤于hdfs导⼊,不适合导⼊hive⽬录
–where从关系数据库导⼊数据时的查询条件,⽰例:–where ‘id = 2′
-z,–compress压缩参数,默认情况下数据是没被压缩的,通过该参数可以使⽤gzip压缩算法对数据进⾏压缩,适⽤
于SequenceFile, text⽂本⽂件, 和Avro⽂件
–compression-codec Hadoop压缩编码,默认是gzip
–null-string <null-string>可选参数,如果没有指定,则字符串null将被使⽤
–null-non-string<null-string>可选参数,如果没有指定,则字符串null将被使⽤
增量导⼊
参数说明
–check-column (col)⽤来作为判断的列名,如id
–incremental (mode)append:追加,⽐如对⼤于last-value指定的值之后的记录进⾏追加导⼊。lastmodified:最后的修
改时间,追加last-value指定的⽇期之后的记录
–last-value (value)指定⾃从上次导⼊后列的最⼤值(⼤于该指定的值),也可以⾃⼰设定某⼀值
对incremental参数,如果是以⽇期作为追加导⼊的依据,则使⽤lastmodified,否则就使⽤append值。
7. import-all-tables
将数据库⾥的所有表导⼊到HDFS中,每个表在hdfs中都对应⼀个独⽴的⽬录。
sqoop import-all-tables –connect jdbc:mysql://localhost:3306/test
sqoop import-all-tables –connect jdbc:mysql://localhost:3306/test –hive-import
参数说明
–as-avrodatafile同import参数
–as-sequencefile同import参数
–as-textfile同import参数
–direct同import参数
–direct-split-size <n>同import参数
–inline-lob-limit <n>同import参数
-
m,–num-mappers <n>同import参数
–warehouse-dir <dir>同import参数
-z,–compress同import参数
–compression-codec同import参数
8. job
⽤来⽣成⼀个sqoop的任务,⽣成后,该任务并不执⾏,除⾮使⽤命令执⾏该任务。
sqoop job
参数说明
–create <job-id>⽣成⼀个job,⽰例如:sqoop job –create myjob — import –
connectjdbc:mysql://localhost:3306/test –table
person
–delete <job-id>删除⼀个jobsqoop job –delete myjob
–exec <job-id>执⾏⼀个jobsqoop job –exec myjob
–help显⽰帮助说明
–list显⽰所有的jobsqoop job –list
–meta-connect <jdbc-uri>⽤来连接metastore服务,⽰例如:–meta-connect jdbc:hsqldb:hsql://localhost:16000/sqoop
–show <job-id>显⽰⼀个job的各种参数sqoop job –show myjob
–verbose打印命令运⾏时的详细信息
9. list-databases
打印出关系数据库所有的数据库名
sqoop list-databases –connect jdbc:mysql://localhost:3306/ -username root -password 123456
10. list-tables
打印出关系数据库某⼀数据库的所有表名
sqoop list-tables –connect jdbc:mysql://localhost:3306/zihou -username root -password 123456
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 <path>Hdfs中存放数据的⼀个⽬录,该⽬录中的数据是希望在合并后能优先保留的,原则上⼀般是存放越mysql操作官方文档
新数据的⽬录就对应这个参数。
–onto <path>Hdfs中存放数据的⼀个⽬录,该⽬录中的数据是希望在合并后能被更新数据替换掉的,原则上⼀般
是存放越旧数据的⽬录就对应这个参数。
–merge-key <col>合并键,⼀般是主键ID
–jar-file <file>合并时引⼊的jar包,该jar包是通过Codegen⼯具⽣成的jar包
–class-name <class>对应的表名或对象名,该class类是包含在jar包中的。
–target-dir <path>合并后的数据在HDFS⾥的存放⽬录
12. metastore
记录sqoop job的元数据信息,如果不启动metastore实例,则默认的元数据存储⽬录为:~/.sqoop,如果要更改存储⽬录,可以在配置⽂件l中进⾏更改。
metastore实例启动:sqoop metastore
参数说明
–shutdown关闭⼀个运⾏的metastore实例
13. version
显⽰sqoop版本信息
语句:sqoop version
14. help
打印sqoop帮助信息
语句:sqoop help
15. 公共参数
Hive参数
参数说明
–hive-delims-replacement <arg>⽤⾃定义的字符串替换掉数据中的\n, \r, and \01等字符
–hive-drop-import-delims在导⼊数据到hive中时,去掉数据中\n,\r和\01这样的字符
–map-column-hive <arg>⽣成hive表时,可以更改⽣成字段的数据类型,格式如:–map-column-
hiveTBL_ID=String,LAST_ACCESS_TIME=string
–hive-partition-key创建分区,后⾯直接跟分区名即可,创建完毕后,通过describe 表名可以看到分区名,默认为string
型
–hive-partition-value<v>该值是在导⼊数据到hive中时,与–hive-partition-key设定的key对应的value值。
–hive-home <dir>Hive的安装⽬录,可以通过该参数覆盖掉默认的hive⽬录
–hive-import将数据从关系数据库中导⼊到hive表中
–hive-overwrite覆盖掉在hive表中已经存在的数据
–create-hive-table默认是false,如果⽬标表已经存在了,那么创建任务会失败
–hive-table后⾯接要创建的hive表
–table指定关系数据库表名
数据库连接参数
参数说明
–connect <jdbc-uri>Jdcb连接url,⽰例如:–connect jdbc:mysql://localhost:3306/hive
–connection-manager <class-name>指定要使⽤的连接管理类
–driver <class-name>数据库驱动类
–hadoop-home <dir>Hadoop根⽬录
–help打印帮助信息
-P从控制端读取密码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论