您的足迹:首页 > Sqoop >sqoop 常用命令整理

sqoop 常用命令整理

这些内容是从sqoop的官网整理出来的,是1.4.3版本的Document,如果有错误,希望大家指正。

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 string> ...

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 

7. --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 [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类型

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   Output directory for compiled objects

  --class-name   Sets the generated class name. This overrides --package-name. When combined with --jar-file, sets the input class.

  --jar-file   Disable code generation; use specified jar

  --outdir   Output directory for generated code

  --package-name   Put auto-generated classes in this package

  --map-column-java   Override default mapping from SQL type to Java type for configured columns.

18.通过配置文件conf/sqoop-site.xml来配置常用参数

 <property>
    <name>property.name</name>
    <value>property.value</value>
 </property>

如果不在这里面配置的话,就需要像这样写命令

    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.RowCountValidator

Validation 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.AbsoluteValidationThreshold

Validation 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

27.validate例子

$ 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

29.sqoop job 保存常用的作业,以便下次快速调用

 --create <job-id>  创建一个新的job.
  --delete <job-id>  删除job
  --exec <job-id>     执行job
  --show <job-id>    显示job的参数
  --list                     列出所有的job

30.例子

#创建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:
...

31.别的常用工具

  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

后面是附录,我把前面攒得一些东西放在这里了。


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>     复制结束符


本博客所有文章如无特别注明均为原创。作者:数据为王复制或转载请以超链接形式注明转自 数据为王
原文地址《sqoop 常用命令整理

相关推荐


  • blogger

发表评论

路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交

网友评论(0)