扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本文档主要对SQOOP的使用进行了说明,参考内容主要来自于Cloudera SQOOP的官方文档。为了用中文更清楚明白地描述各参数的使用含义,本文档几乎所有参数使用说明都经过了我的实际验证而得到。
成都创新互联公司主要从事成都网站建设、网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务武穴,10余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
将关系数据库表映射为一个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 | 指定生成的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文件中的各属性与该表的各字段一一对应。 |
生成与关系数据库表的表结构对应的HIVE表
基础语句:
sqoop create-hive-table –connect jdbc:mysql://localhost:3306/hive -username root -password 123456 –table TBLS –hive-table h_tbls2
参数 | 说明 |
–hive-home | Hive的安装目录,可以通过该参数覆盖掉默认的hive目录 |
–hive-overwrite | 覆盖掉在hive表中已经存在的数据 |
–create-hive-table | 默认是false,如果目标表已经存在了,那么创建任务会失败 |
–hive-table | 后面接要创建的hive表 |
–table | 指定关系数据库表名 |
可以快速地使用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语句,皆可运行无误,如上。
从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 | 存放数据的HDFS的源目录 |
-m,–num-mappers | 启动N个map来并行导入数据,默认是4个,最好不要将数字设置为高于集群的最大Map数 |
–table | 要导入到的关系数据库表 |
–update-key | 后面接条件列名,通过该参数,可以将关系数据库中已经存在的数据进行更新操作,类似于关系数据库中的update操作 |
–update-mode | 更新模式,有两个值updateonly和默认的allowinsert,该参数只能是在关系数据表里不存在要导入的记录时才能使用,比如要导入的hdfs中有一条id=1的记录,如果在表里已经有一条记录id=2,那么更新会失败。 |
–input-null-string | 可选参数,如果没有指定,则字符串null将被使用 |
–input-null-non-string | 可选参数,如果没有指定,则字符串null将被使用 |
–staging-table | 该参数是用来保证在数据导入关系数据库表的过程中事务安全性的,因为在导入的过程中可能会有多个事务,那么一个事务失败会影响到其它事务,比如导入的数据会出现错误或出现重复的记录等等情况,那么通过该参数可以避免这种情况。创建一个与导入目标表同样的数据结构,保留该表为空在运行数据导入前,所有事务会将结果先存放在该表中,然后最后由该表通过一次事务将结果写入到目标表中。 |
–clear-staging-table | 如果该staging-table非空,则通过该参数可以在运行导入前清除staging-table里的数据。 |
–batch | 该模式用于执行基本语句(暂时还不太清楚含义) |
将数据库表的数据导入到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 | 边界查询,也就是在导入前先通过SQL查询得到一个结果集,然后导入的数据就是该结果集内的数据,格式如:–boundary-query ‘select id,creationdate from person where id = 3’,表示导入的数据为id=3的记录,或者select min(
增量导入
对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
8. job用来生成一个sqoop的任务,生成后,该任务并不执行,除非使用命令执行该任务。 sqoop job
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生成的
12. metastore记录sqoop job的元数据信息,如果不启动metastore实例,则默认的元数据存储目录为:~/.sqoop,如果要更改存储目录,可以在配置文件sqoop-site.xml中进行更改。 metastore实例启动:sqoop metastore
13. version显示sqoop版本信息 语句:sqoop version 14. help打印sqoop帮助信息 语句:sqoop help 15. 公共参数Hive参数
数据库连接参数
文件输出参数用于import场景。 示例如: sqoop import –connect jdbc:mysql://localhost:3306/test –username root –P –table person –split-by id –check-column id –incremental append –last-value 1 –enclosed-by ‘\”‘ –escaped-by \# –fields-terminated-by .
文件输入参数对数据格式的解析,用于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,dd@dd.com,1,2013-08-07 16:00:48.0,”hehe”,测试 上面的各字段是以逗号分隔的,那么在解析时,必须要以逗号来解析出各字段值,如: –input-fields-terminated-by ‘,’
分享文章:sqoop中文手册 转载来源:http://kswjz.com/article/ispooe.html 扫二维码与项目经理沟通我们在微信上24小时期待你的声音 解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流 |