sqoop常用命令整理(一)

岑玉海發表於2016-09-09
這些內容是從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 <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/ 目錄。
 sqoop import --connnect <connect-str> --table foo --warehouse-dir /shared 

或者

 sqoop import --connnect <connect-str> --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 <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時刪除
,
, and 1 
  –hive-delims-replacement  匯入到hive時用自定義的字元替換掉
,
, and 1 
  –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。
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.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 `	` --lines-terminated-by `
` 
    --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


相關文章