sqoop實例操作及詳細參數解析

1、MySQL數據庫中的數據導入到Hadoop的HDFS:
使用命令:

    $ sqoop import
    $ sqoop-import

示例:

$ sqoop import \
    --connect jdbc:mysql://localhost/userdb \
    --username root \
    --table emp \
    --m 1 \
    --target-dir /queryresult \
    --incremental append \
    --check-column id \
    -last value 1205 \
    --where “city =’sec-bad’” 

註釋:

sqoop import \   sqoop導入命令
--connect jdbc:mysql://localhost/userdb \    連接mysql數據庫表
--username root \    數據庫賬戶名
--table emp \    數據庫表
--m 1 \    開啓map個數,即進程
--target-dir /queryresult \  導入目標地址(該目錄下目標表不能存在)
--incremental append \    增量導入
--check-column id \    增量導入校驗列
-last value 1205 \  從哪個值開始導入
--where “city =’sec-bad’” 條件

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類型

將數據庫中所有表導入HDFS:

$ sqoop import-all-table
$ sqoop-import-all-tables

示例:

$ sqoop import \
--connect jdbc:mysql://localhost/userdb \
--username root

注:如果使用的是import-all-tables,它是強制性的,在該數據庫中的每個表必須有一個主鍵字段。

2、從HDFS導出到RDBMS數據庫:
使用命令:

$ sqoop export
$ sqoop-export
示例:
$ sqoop export \
--connect jdbc:mysql://localhost/db \
--username root \
--table employee \ 
--export-dir /emp/emp_data

註釋:

$ sqoop export \     sqoop導出數據命令
--connect jdbc:mysql://localhost/db \      連接數據庫
--username root \     數據庫賬戶
--table employee \    目標數據庫表(類型一致,已創建)
--export-dir /emp/emp_data     導出路徑

3、 創建Sqoop作業
使用命令:

$ sqoop job
$ sqoop-job

參數 說明
–create 生成一個job
–delete 刪除一個jobsqoop job –delete myjob
–exec 執行一個jobsqoop job –exec myjob
–help 顯示幫助說明
–list 顯示所有的jobsqoop job –list
–meta-connect 用來連接metastore服務
–show 顯示一個job的各種參數sqoop job –show myjob
–verbose 打印命令運行時的詳細信息

4、創建作業(–create)

$ sqoop job --create myjob \
--import \
--connect jdbc:mysql://localhost/db \
--username root \
--table employee --m 1

作業方便複用,而且如果是增量計算的話,不用手動設置增量值(自動記憶)。
5、驗證作業 (–list)
‘–list’ 參數是用來驗證保存的作業。下面的命令用來驗證保存Sqoop作業的列表。

$ sqoop job --list

它顯示保存作業列表。
6、檢查作業(–show)
‘–show’ 參數用於檢查或驗證特定的工作,及其詳細信息。以下命令和樣本輸出用來驗證一個名爲myjob的作業。

$ sqoop job --show myjob

它顯示工具和它們的選擇,這是使用在myjob中作業情況。

7、執行作業 (–exec)
‘–exec’ 選項用於執行保存的作業。下面的命令用於執行保存的作業稱爲myjob。

$ sqoop job --exec myjob

8、Sqoop代碼生成

$ sqoop codegen 
$ sqoop-codegen

示例:

$ sqoop codegen \
--connect jdbc:mysql://localhost/userdb \
--username root \ 
--table emp

這個命令會生成實現操作的java代碼。

參數說明
–bindir 指定生成的java文件、編譯成的class文件及將生成文件打包爲JAR的JAR包文件輸出路徑
–class-name 設定生成的Java文件指定的名稱
–outdir 生成的java文件存放路徑
–package-name 包名,如cn.cnnic,則會生成cn和cnnic兩級目錄,生成的文件(如java文件)就存放在cnnic目錄裏
–input-null-non-string 在生成的java文件中,可以將null字符串設爲想要設定的值(比如空字符串’’)
–input-null-string 同上,設定時,最好與上面的屬性一起設置,且設置同樣的值(比如空字符串等等)。
–map-column-java 數 據庫字段在生成的java文件中會映射爲各種屬性,且默認的數據類型與數據庫類型保持對應,比如數據庫中某字段的類型爲bigint,則在Java文件中 的數據類型爲long型,通過這個屬性,可以改變數據庫字段在java中映射的數據類型,格式如:–map-column-java DB_ID=String,id=Integer
–null-non-string 在生成的java文件中,比如TBL_ID==null?”null”:””,通過這個屬性設置可以將null字符串設置爲其它值如ddd,TBL_ID==null?”ddd”:””
–null-string 同上,使用的時候最好和上面的屬性一起用,且設置爲相同的值
–table 對應關係數據庫的表名,生成的java文件中的各屬性與該表的各字段一一對應。

9、用戶執行用戶定義的查詢

$ sqoop eval
$ sqoop-eval

示例:

$ sqoop eval \
--connect jdbc:mysql://localhost/db \
--username root \ 
--query “SELECT * FROM employee LIMIT 3”   支持自定義sql查詢
-e “INSERT INTO employee VALUES(1207,‘Raju’,‘UI dev’,15000,‘TP’)”

–query與-e兩個參數皆可運行自定義sql查詢,如果命令成功執行,那麼它會顯示在控制檯上更新的行的狀態。

10、列出所有數據庫/表

$ sqoop list-databases/list-tables
$ sqoop-list-databases/list-tables

11、merge

將HDFS中不同目錄下面的數據合在一起,並存放在指定的目錄中,示例如:

sqoop merge 
–new-data /test/p1/person 
–onto /test/p2/person 
–target-dir /test/merged 
–jar-file /opt/data/sqoop/person/Person.jar 
–class-name Person 
–merge-key id

其中,–class-name所指定的class名是對應於Person.jar中的Person類,而Person.jar是通過Codegen生成的

參數 說明
–new-data Hdfs中存放數據的一個目錄,該目錄中的數據是希望在合併後能優先保留的,原則上一般是存放越新數據的目錄就對應這個參數。
–onto Hdfs中存放數據的一個目錄,該目錄中的數據是希望在合併後能被更新數據替換掉的,原則上一般是存放越舊數據的目錄就對應這個參數。
–merge-key 合併鍵,一般是主鍵ID
–jar-file 合併時引入的jar包,該jar包是通過Codegen工具生成的jar包
–class-name 對應的表名或對象名,該class類是包含在jar包中的。
–target-dir 合併後的數據在HDFS裏的存放目錄

12、一些其他參數

Hive參數
參數 說明
–hive-delims-replacement 用自定義的字符串替換掉數據中的\n, \r, and \01等字符
–hive-drop-import-delims 在導入數據到hive中時,去掉數據中\n,\r和\01這樣的字符
–map-column-hive 生成hive表時,可以更改生成字段的數據類型,格式如:–map-column-hiveTBL_ID=String,LAST_ACCESS_TIME=string
–hive-partition-key 創建分區,後面直接跟分區名即可,創建完畢後,通過describe 表名可以看到分區名,默認爲string型
–hive-partition-value 該值是在導入數據到hive中時,與–hive-partition-key設定的key對應的value值。
–hive-home Hive的安裝目錄,可以通過該參數覆蓋掉默認的hive目錄
–hive-import 將數據從關係數據庫中導入到hive表中
–hive-overwrite 覆蓋掉在hive表中已經存在的數據
–create-hive-table 默認是false,如果目標表已經存在了,那麼創建任務會失敗
–hive-table 後面接要創建的hive表
–table 指定關係數據庫表名
數據庫連接參數
參數 說明
–connect Jdcb連接url,示例如:–connect jdbc:mysql://localhost:3306/hive
–connection-manager 指定要使用的連接管理類
–driver 數據庫驅動類
–hadoop-home Hadoop根目錄
–help 打印幫助信息
-P 從控制端讀取密碼
–password Jdbc url中的數據庫連接密碼
–username Jdbc url中的數據庫連接用戶名
–verbose 在控制檯打印出詳細信息
–connection-param-file 一個記錄着數據庫連接參數的文件

文件輸出參數

用於import場景。 示例如:
sqoop import
–username root
–P
–table person
–split-by id
–check-column id
–incremental append
–last-value 1
–enclosed-by ‘\”‘
–escaped-by #
–fields-terminated-by .
參數 說明
–enclosed-by 給字段值前後加上指定的字符,比如雙引號,示例:–enclosed-by ‘\”‘,顯示例子:”3″,”jimsss”,”[email protected]
–escaped-by 給雙引號作轉義處理,如字段值爲”測試”,經過–escaped-by \處理後,在hdfs中的顯示值爲:\”測試\”,對單引號無效
–fields-terminated-by 設定每個字段是以什麼符號作爲結束的,默認是逗號,也可以改爲其它符號,如句號.,示例如:–fields-terminated-by.
–lines-terminated-by 設定每條記錄行之間的分隔符,默認是換行,但也可以設定自己所需要的字符串,示例如:–lines-terminated-by ‘#’ 以#號分隔
–mysql-delimiters Mysql默認的分隔符設置,字段之間以,隔開,行之間以換行\n隔開,默認轉義符號是\,字段值以單引號’包含起來。
–optionally-enclosed-by enclosed-by是強制給每個字段值前後都加上指定的符號,而–optionally-enclosed-by只是給帶有雙引號或單引號的字段值加上指定的符號,故叫可選的。示例如:–optionally-enclosed-by ‘ ”hehe”,測試$

文件輸入參數

對數據格式的解析,用於export場景,與文件輸出參數相對應。
示例如:
sqoop export –connect jdbc:mysql://localhost:3306/test –username root –password
123456 –table person2 –export-dir /user/hadoop/person –staging-table person3
–clear-staging-table –input-fields-terminated-by ‘,’
在hdfs中存在某一格式的數據,在將這樣的數據導入到關係數據庫中時,必須要按照該格式來解析出相應的字段值,比如在hdfs中有這樣格式的數據:3,jimsss,[email protected],1,2013-08-07 16:00:48.0,”hehe”,測試
上面的各字段是以逗號分隔的,那麼在解析時,必須要以逗號來解析出各字段值,如:–input-fields-terminated-by ‘,’
參數 說明
–input-enclosed-by 對字段值前後有指定的字符,比如雙引號的值進行解析:–input-enclosed-by ‘\”‘,數據例子:”3″,”jimsss”,”[email protected]
–input-escaped-by 對含有轉義雙引號的字段值作轉義處理,如字段值爲\”測試\”,經過–input-escaped-by \處理後,解析得到的值爲:”測試”,對單引號無效。
–input-fields-terminated-by 以字段間的分隔符來解析得到各字段值,示例如:– input-fields-terminated-by,
–input-lines-terminated-by 以每條記錄行之間的分隔符來解析得到字段值,示例如:–input-lines-terminated-by ‘#’ 以#號分隔
–input-optionally-enclosed-by 與–input-enclosed-by功能相似,與–input-enclosed-by的區別參見輸出參數中對–optionally-enclosed-by的描述

13、貢獻幾個實例
sqoop將mysql導入hive表create-hive-table,首先將關係數據庫表的表結構對應的HIVE表

sqoop create-hive-tableconnect jdbc:mysql://localhost:3306/hive -username root -password 123456table TBLS –hive-table h_tbls2

參數 說明
–hive-home Hive的安裝目錄,可以通過該參數覆蓋掉默認的hive目錄
–hive-overwrite 覆蓋掉在hive表中已經存在的數據
–create-hive-table 默認是false,如果目標表已經存在了,那麼創建任務會失敗
–hive-table 後面接要創建的hive表
–table 指定關係數據庫表名

將數據庫表的數據導入到hive中,如果在hive中沒有對應的表,則自動生成與數據庫表名相同的表。

sqoop import 
--connect jdbc:mysql://localhost:3306/hive 
--username root 
--password 123456
--table user 
--split-by id 
--hive-import

參數 說明
–append 將數據追加到hdfs中已經存在的dataset中。使用該參數,sqoop將把數據先導入到一個臨時目錄中,然後重新給文件命名到一個正式的目錄中,以避免和該目錄中已存在的文件重名。
–as-avrodatafile 將數據導入到一個Avro數據文件中
–as-sequencefile 將數據導入到一個sequence文件中
–as-textfile 將數據導入到一個普通文本文件中,生成該文本文件後,可以在hive中通過sql語句查詢出結果。
–boundary-query 邊 界查詢,也就是在導入前先通過SQL查詢得到一個結果集,然後導入的數據就是該結果集內的數據,格式如:–boundary-query ‘select id,creationdate from person where id = 3′,表示導入的數據爲id=3的記錄,或者select min(), max() from ,注意查詢的字段中不能有數據類型爲字符串的字段,否則會報錯:java.sql.SQLException: Invalid value for getLong(),目前問題原因未知。
–columns 指定要導入的字段值,格式如:–columns id,username
–direct 直接導入模式,使用的是關係數據庫自帶的導入導出工具。官網上是說這樣導入會更快
–direct-split-size 在使用上面direct直接導入的基礎上,對導入的流按字節數分塊,特別是使用直連模式從PostgreSQL導入數據的時候,可以將一個到達設定大小的文件分爲幾個獨立的文件。
–inline-lob-limit 設定大對象數據類型的最大值
-m,–num-mappers 啓動N個map來並行導入數據,默認是4個,最好不要將數字設置爲高於集羣的節點數
–query,-e 從 查詢結果中導入數據,該參數使用時必須指定–target-dir、–hive-table,在查詢語句中一定要有where條件且在where條件中需 要包$CONDITIONS
示例:–query ‘select * from person where $CONDITIONS ‘ –target-dir
/user/hive/warehouse/person –hive-table person

–split-by 表的列名,用來切分工作單元,一般後面跟主鍵ID
–table 關係數據庫表名,數據從該表中獲取
–target-dir 指定hdfs路徑
–warehouse-dir 與–target-dir不能同時使用,指定數據導入的存放目錄,適用於hdfs導入,不適合導入hive目錄
–where 從關係數據庫導入數據時的查詢條件,示例:–where ‘id = 2′
-z,–compress 壓縮參數,默認情況下數據是沒被壓縮的,通過該參數可以使用gzip壓縮算法對數據進行壓縮,適用於SequenceFile, text文本文件, 和Avro文件
–compression-codec Hadoop壓縮編碼,默認是gzip
–null-string 可選參數,如果沒有指定,則字符串null將被使用
–null-non-string 可選參數,如果沒有指定,則字符串null將被使用

增量導入參數 說明

–check-column (col) 用來作爲判斷的列名,如id –incremental
(mode) append:追加,比如對大於last-value指定的值之後的記錄進行追加導入。lastmodified:最後的修改時間,追加last-value指定的日期之後的記錄
–last-value (value) 指定自從上次導入後列的最大值(大於該指定的值),也可以自己設定某一值。
–split-by指定數據庫表中的主鍵字段名,在這裏爲id。

將hive數據導出到mysql表:

sqoop eval 
--connect 'jdbc:mysql://localhost:3306/data_analyses?useUnicode=true&characterEncoding=utf-8' 
--username data  
--password x8
--query "delete from d_compete_run_time_statistic"

sqoop export --connect 'jdbc:mysql://localhost:3306/data_analyses?useUnicode=true&characterEncoding=utf-8' 
--username data  
--password x8 
--table d_compete_run_time_statistic 
--export-dir /user/hive/warehouse/dm.db/d_compete_run_time_statistic --input-fields-terminated-by '\t' --input-null-string '\\N' --input-null-non-string '\\N'

參考文檔:
sqoop學習筆記
Sqoop教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章