1.使用sqoop导入数据
sqoop import —connect jdbc:mysql://localhost/db —username foo —table TEST
2.账号密码
sqoop import —connect jdbc:mysql://database.example.com/employees —username aaron —password 12345
3.驱动
sqoop import —driver com.microsoft.jdbc.sqlserver.SQLServerDriver /
—connect…
4.写sql语句导入的方式
sqoop import /
—query ‘SELECT a., b. FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS’ /
—split-by a.id —target-dir /user/foo/joinresults
如果是顺序导入的话,可以只开一个线程
sqoop import /
—query ‘SELECT a., b. FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS’ /
-m 1 —target-dir /user/foo/joinresults
如果where语句中有要用单引号的,就像这样子写就可以啦”SELECT * FROM x WHERE a=’foo’ AND /$CONDITIONS”
5. 1.4.3版本的sqoop不支持复杂的sql语句,不支持or语句
6. —split-by
默认是主键,假设有100行数据,它会执行那个SELECT * FROM sometable WHERE id >= lo AND id < hi,
with (lo, hi) 会分为4次导入(0,250),(250,500),(500,750),(750,1001)
如果这个字段不能达到实际的划分区域的效果,可以用别的字段。如果没有索引列或者是组合主键的表,需要手动设置一个划分列
7.—direct
—direct 是为了利用某些数据库本身提供的快速导入导出数据的工具,比如mysql的mysqldump
性能比jdbc更好,但是不支持大对象的列,使用的时候,那些快速导入的工具的客户端必须的shell脚本的目录下
8.导入数据到hdfs目录
这个命令会把数据写到/shared/foo/ 目录
sqoop import —connnect—table foo —warehouse-dir /shared /
或者
sqoop import —connnect—table foo —target-dir /dest /
9.传递参数给快速导入的工具,使用—开头,下面这句命令传递给mysql默认的字符集是latin1
sqoop import —connect jdbc:mysql://server.foo.com/db —table bar /
—direct — —default-character-set=latin1
10.转换为对象
—map-column-java
转换为java数据类型
—map-column-hive转转为hive数据类型
11.增加导入
—check-column (col) Specifies the column to be examined when determining which rows to import.
—incremental (mode) Specifies how Sqoop determines which rows are new. Legal values for mode include append and lastmodified.
—last-value (value) Specifies the maximum value of the check column from the previous import.
增加导入支持两种模式append和lastmodified,用—incremental来指定
12.大对象
在导入大对象,比如BLOB和CLOB列时需要特殊处理,小于16MB的大对象可以和别的数据一起存储,超过这个值就存储在_lobs的子目录当中。
它们采用的是为大对象做过优化的存储格式,最大能存储2^63字节的数据,我们可以用—inline-lob-limit参数来指定每个lob文件最大的限制是多少。如果设置为0,则大对象使用外部存储。
13.分隔符、转移字符
下面的这句话
Some string, with a comma.
Another “string with quotes”
使用这句命令导入$ sqoop import —fields-terminated-by , —escaped-by // —enclosed-by ‘/“‘ …
会有下面这个结果
“Some string, with a comma.”,”1”,”2”,”3”…
“Another /“string with quotes/“”,”4”,”5”,”6”…
使用这句命令导入$ sqoop import —optionally-enclosed-by ‘/“‘ (the rest as above)…
“Some string, with a comma.”,1,2,3…
“Another /“string with quotes/“”,4,5,6…
14.hive导入参数
—hive-home
重写$HIVE_HOME
—hive-import 插入数据到hive当中,使用hive的默认分隔符
—hive-overwrite 重写插入
—create-hive-table 建表,如果表已经存在,该操作会报错!
—hive-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-valuehive分区的值
—map-column-hive
15.hive空值处理
sqoop会自动把NULL转换为null处理,但是hive中默认是把/N来表示null,因为预先处理不会生效的
我们需要使用 —null-string 和 —null-non-string来处理空值 把/N转为//N
sqoop import … —null-string ‘//N’ —null-non-string ‘//N’
16.导入数据到HBase
导入的时候加上—hbase-table,它就会把内容导入到hbase当中,默认是用主键作为split列。
也可以用—hbase-row-key来指定,列族用—column-family来指定,它不支持—direct。
如果不想手动建表或者列族,就用—hbase-create-table参数
17.代码生成参数
--bindir <dir> Output directory for compiled objects
--class-name <name> Sets the generated class name. This overrides --package-name. When combined with --jar-file, sets the input class.
--jar-file <file> Disable code generation; use specified jar
--outdir <dir> Output directory for generated code
--package-name <name> Put auto-generated classes in this package
--map-column-java <m> Override default mapping from SQL type to Java type for configured columns.
18.通过配置文件conf/sqoop-site.xml来配置常用参数
property.name
property.value
如果不在这里面配置的话,就需要像这样写命令
sqoop import -D property.name=property.value …
19.两个特别的参数
sqoop.bigdecimal.format.string 大decimal是否保存为string,如果保存为string就是 0.0000007,否则则为1E7
sqoop.hbase.add.row.key 是否把作为rowkey的列也加到行数据当中,默认是false的
20.示例:
#指定列
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES /
--columns "employee_id,first_name,last_name,job_title"
#使用8个线程
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES /
-m 8
#快速模式
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES /
--direct
#使用sequencefile作为存储方式
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES /
--class-name com.foocorp.Employee --as-sequencefile
#分隔符
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES /
--fields-terminated-by '/t' --lines-terminated-by '/n' /
--optionally-enclosed-by '/"'
#导入到hive
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES /
--hive-import
#条件过滤
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES /
--where "start_date > '2010-01-01'"
#用dept_id作为分个字段
$ sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES /
--split-by dept_id
#追加导入
$ sqoop import --connect jdbc:mysql://db.foo.com/somedb --table sometable /
--where "id > 100000" --target-dir /incremental_dataset --append
21.导入所有的表sqoop-import-all-tables
每个表都要有主键,不能使用where条件过滤
sqoop import-all-tables —connect jdbc:mysql://db.foo.com/corp
22.export
我们采用sqoop export插入数据的时候,如果数据已经存在了,插入会失败。
如果我们使用—update-key,它会认为每个数据都是更新,比如我们使用下面这条语句。
Sqoop export —table foo —update-key id —export-dir /path/to/data —connect …
UPDATE foo SET msg=’this is a test’, bar=42 WHERE id=0;
UPDATE foo SET msg=’some more data’, bar=100 WHERE id=1;
…
这样即使找不到它也不会报错
23.如果存在就更新,不存在就插入
加上这个参数就可以啦—update-mode allowinsert
24.事务的处理
它会一次statement插入100条数据,然后每100个statement提交一次,所以一次就会提交10000条数据
25.示例
$ sqoop export —connect jdbc:mysql://db.example.com/foo —table bar /
—export-dir /results/bar_data
$ sqoop export —connect jdbc:mysql://db.example.com/foo —table bar /
—export-dir /results/bar_data —validate
$ sqoop export —connect jdbc:mysql://db.example.com/foo —call barproc /
—export-dir /results/bar_data
26.Validate 它用来比较源数据和目标数据的数量 它有三个接口 Validator.
Validator.
Property: validator
Description: Driver for validation,
must implement org.apache.sqoop.validation.Validator
Supported values: The value has to be a fully qualified class name.
Default value: org.apache.sqoop.validation.RowCountValidatorValidation Threshold
Property: validation-threshold
Description: Drives the decision based on the validation meeting the
threshold or not. Must implement
org.apache.sqoop.validation.ValidationThreshold
Supported values: The value has to be a fully qualified class name.
Default value: org.apache.sqoop.validation.AbsoluteValidationThresholdValidation Failure Handler
Property: validation-failurehandler
Description: Responsible for handling failures, must implement
org.apache.sqoop.validation.ValidationFailureHandler
Supported values: The value has to be a fully qualified class name.
Default value: org.apache.sqoop.validation.LogOnFailureHandler
示例:
$sqoop import --connect jdbc:mysql://db.foo.com/corp /
--table EMPLOYEES --validate
$sqoop export --connect jdbc:mysql://db.example.com/foo --table bar /
--export-dir /results/bar_data --validate
$sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES /
--validate --validator org.apache.sqoop.validation.RowCountValidator /
--validation-threshold /
org.apache.sqoop.validation.AbsoluteValidationThreshold /
--validation-failurehandler /
org.apache.sqoop.validation.LogOnFailureHandler
27.sqoop job 保存常用的作业,以便下次快速调用
—create
创建一个新的job.
—delete删除job
—exec执行job
—show显示job的参数
—list 列出所有的job
示例:
#创建job
$ sqoop job --create myjob -- import --connect jdbc:mysql://example.com/db /
--table mytable
#列出所有job
$ sqoop job --list
#查看job
$ sqoop job --show myjob
Job: myjob
Tool: import
Options:
----------------------------
direct.import = false
codegen.input.delimiters.record = 0
hdfs.append.dir = false
db.table = mytable
...
#执行job
$ sqoop job --exec myjob
10/08/19 13:08:45 INFO tool.CodeGenTool: Beginning code generation
...
#重写参数
$ sqoop job --exec myjob -- --username someuser -P
Enter password:
...
28.其他常用工具
sqoop-metastore
sqoop-merge
#合并两个目录
$ sqoop merge --new-data newer --onto older --target-dir merged /
--jar-file datatypes.jar --class-name Foo --merge-key id
sqoop-codegen
sqoop-create-hive-table
#在hive中创建一个名叫emps的和employees一样的表
$ sqoop create-hive-table --connect jdbc:mysql://db.example.com/corp /
--table employees --hive-table emps
sqoop-eval
#选择10行数据
$ sqoop eval --connect jdbc:mysql://db.example.com/corp /
--query "SELECT * FROM employees LIMIT 10"
#往foo表插入一行
$ sqoop eval --connect jdbc:mysql://db.example.com/corp /
-e "INSERT INTO foo VALUES(42, 'bar')"
sqoop-list-databases
$ sqoop list-databases --connect jdbc:mysql://database.example.com/
information_schema
employees
sqoop-list-tables
29 附录:
import的主要参数
--connect <jdbc-uri> jdbc连接地址
--connection-manager <class-name> 连接管理者
--driver <class-name> 驱动类
--hadoop-mapred-home <dir> $HADOOP_MAPRED_HOME
--help help信息
-P 从命令行输入密码
--password <password> 密码
--username <username> 账号
--verbose 打印信息
--connection-param-file <filename> 可选参数
Argument Description
--append 添加到hdfs中已经存在的dataset
--as-avrodatafile 导入数据作为avrodata
--as-sequencefile 导入数据位SequenceFiles
--as-textfile 默认导入数据为文本
--boundary-query <statement> 创建splits的边界
--columns <col,col,col…> 选择列
--direct 使用直接导入快速路径
--direct-split-size <n> 在快速模式下每n字节使用一个split
--fetch-size <n> 一次读入的数量
--inline-lob-limit <n> 最大数值 an inline LOB
-m,--num-mappers <n> 通过实行多少个map,默认是4个,某些数据库8 or 16性能不错
-e,--query <statement> 通过查询语句导入
--split-by <column-name> 创建split的列,默认是主键
--table <table-name> 要导入的表名
--target-dir <dir> HDFS 目标路径
--warehouse-dir <dir> HDFS parent for table destination
--where <where clause> where条件
-z,--compress Enable compression
--compression-codec <c> 压缩方式,默认是gzip
--null-string <null-string> 字符列null值
--null-non-string <null-string> 非字符列null值
export主要参数
--direct 快速导入
--export-dir <dir> HDFS到处数据的目录
-m,--num-mappers <n> 都少个map线程
--table <table-name> 导出哪个表
--call <stored-proc-name> 存储过程
--update-key <col-name> 通过哪个字段来判断更新
--update-mode <mode> 插入模式,默认是只更新,可以设置为allowinsert.
--input-null-string <null-string> 字符类型null处理
--input-null-non-string <null-string> 非字符类型null处理
--staging-table <staging-table-name> 临时表
--clear-staging-table 清空临时表
--batch 批量模式
转义字符相关参数。
Argument Description
--enclosed-by <char> 设置字段结束符号
--escaped-by <char> 用哪个字符来转义
--fields-terminated-by <char> 字段之间的分隔符
--lines-terminated-by <char> 行分隔符
--mysql-delimiters 使用mysql的默认分隔符: , lines: /n escaped-by: / optionally-enclosed-by: '
--optionally-enclosed-by <char> 复制结束符