天天看點

sqoop 常用指令整理

這些内容是從sqoop的官網整理出來的,是1.4.3版本的Document,如果有錯誤,希望大家指正。 1.使用sqoop導入資料 2.賬号密碼

sqoop import --connect jdbc:mysql://database.example.com/employees \
    --username aaron --password 12345
           

3.驅動

sqoop import --driver com.microsoft.jdbc.sqlserver.SQLServerDriver \
    --connect <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 <column-name>

預設是主鍵,假設有100行資料,它會執行那個SELECT * FROM sometable WHERE id >= lo AND id < hi, with (lo, hi)  會分為4次導入(0,250),(250,500),(500,750),(750,1001) 如果這個字段不能達到實際的劃分區域的效果,可以用别的字段。如果沒有索引列或者是組合主鍵的表,需要手動設定一個劃分列。 7. --direct 是為了利用某些資料庫本身提供的快速導入導出資料的工具,比如mysql的mysqldump性能比jdbc更好,但是不知大對象的列,使用的時候,那些快速導入的工具的用戶端必須的shell腳本的目錄下。 8.導入資料到hdfs目錄,這個指令會把資料寫到/shared/foo/ 目錄。 或者

9.傳遞參數給快速導入的工具,使用--開頭,下面這句指令傳遞給mysql預設的字元集是latin1。

sqoop import --connect jdbc:mysql://server.foo.com/db --table bar \
    --direct -- --default-character-set=latin1
           

10.轉換為對象   --map-column-java <mapping>  轉換為java資料類型   --map-column-hive <mapping>  轉轉為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 <dir>  重寫$HIVE_HOME   --hive-import          插入資料到hive當中,使用hive的預設分隔符   --hive-overwrite  重寫插入   --create-hive-table  建表,如果表已經存在,該操作會報錯!   --hive-table <table-name>  設定到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 <v>  hive分區的值   --map-column-hive <map>          類型比對,sql類型對應到hive類型 15.hive空值處理 sqoop會自動把NULL轉換為null處理,但是hive中預設是把\N來表示null,因為預先處理不會生效的。我們需要使用 --null-string 和 --null-non-string來處理空值 把\N轉為\\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.name</name>
    <value>property.value</value>
 </property>
           

如果不在這裡面配置的話,就需要像這樣寫指令 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條件過濾 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 \

           

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
           

28.sqoop job 儲存常用的作業,以便下次快速調用

  --create <job-id>   建立一個新的job.

  --delete <job-id>   删除job

  --exec <job-id>    執行job

  --show <job-id>    顯示job的參數

  --list          列出所有的job

29.例子

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

30.别的常用工具

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: '
--op