1. 程式人生 > >sqoop 匯入mysql資料到hive中,把多個mysql欄位資料型別轉換hive資料型別

sqoop 匯入mysql資料到hive中,把多個mysql欄位資料型別轉換hive資料型別

如:

sqoop import --connect "jdbc:mysql://192.168.2.42:3306/test?useUnicode=true&characterEncoding=utf-8" --username smap --password ***** --hive-table table_201711 --table table_201711 --hive-import --map-column-java start_time=java.sql.Timestamp,end_time=java.sql.Timestamp,receive_time=java.sql.Timestamp --map-column-hive start_time=TIMESTAMP,end_time=TIMESTAMP,receive_time=TIMESTAMP  --check-column id --incremental append --last-value 0


這些內容是從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