Sqoop是一種用于在Hadoop和關系數據庫或大型機之間傳輸數據的工具。您可以使用Sqoop從關系數據庫管理系統(RDBMS)(如MySQL、Oracle或大型機)導入數據到Hadoop分布式文件系統(HDFS),在Hadoop MapReduce中轉換數據,然后將數據導出回RDBMS。
一、安裝
測試環境:centos7、JDK8、hadoop2.7.2
step1: 下載安裝
到官網選擇適合鏡像地址下載 sqoop download
說明:sqoop對應hadoop2.x的版本不要求小本版號一致,無須糾結hadoop2.7.2和sqoop-1.4.7.bin__hadoop-2.6.0不兼容
wget http://archive.apache.org/dist/sqoop/1.4.7/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
tar xvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /opt
ln -s /opt/sqoop-1.4.7.bin__hadoop-2.6.0/ /opt/apps/sqoop
step2: 修改配置
sqoop啟動環境配置文件
cp /opt/apps/sqoop/conf/sqoop-env-template.sh /opt/apps/sqoop/conf/sqoop-env.sh
在bin/configure-sqoop去掉未安裝的服務如(HCatalog、Accumulo)。否則使用時會報相應未安裝服務的錯誤信息。
vi /opt/apps/sqoop/bin/configure-sqoop
134 ## Moved to be a runtime check in sqoop.
135 #if [ ! -d "${HCAT_HOME}" ]; then
136 # echo "Warning: $HCAT_HOME does not exist! HCatalog jobs will fail."
137 # echo 'Please set $HCAT_HOME to the root of your HCatalog installation.'
138 #fi
139 #
140 #if [ ! -d "${ACCUMULO_HOME}" ]; then
141 # echo "Warning: $ACCUMULO_HOME does not exist! Accumulo imports will fail."
142 # echo 'Please set $ACCUMULO_HOME to the root of your Accumulo installation.'
143 #fi
原文件如下:
image.png
setp3: 添加驅動
以mysql驅動為例,驅動下載地址
將驅動包添加到lib/目錄下
wget -P /opt/apps/sqoop/lib/ http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.40/mysql-connector-java-5.1.40.jar
step4: 配置環境變量(可選)
若不配置環境變量,需到sqoop安裝目錄的bin目錄下執行sqoop命令
vi /etc/profile
export SQOOP_HOME=/opt/apps/sqoop
export PATH=$PATH:$SQOOP_HOME/bin
source /etc/profile
二、使用介紹
使用help命令查看sqoop命令幫助
# ./bin/sqoop help
18/12/02 09:33:12 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
usage: sqoop COMMAND [ARGS]
Available commands:
codegen Generate code to interact with database records
create-hive-table Import a table definition into Hive
eval Evaluate a SQL statement and display the results
export Export an HDFS directory to a database table
help List available commands
import Import a table from a database to HDFS
import-all-tables Import tables from a database to HDFS
import-mainframe Import datasets from a mainframe server to HDFS
job Work with saved jobs
list-databases List available databases on a server
list-tables List available tables in a database
merge Merge results of incremental imports
metastore Run a standalone Sqoop metastore
version Display version information
See 'sqoop help COMMAND' for information on a specific command.
由上可知命令格式:sqoop COMMAND [ARGS]
2.1 參數介紹
2.1.1 sqoop import
- 連接數據庫參數
參數 | 描述 |
---|---|
--connect <jdbc-uri> | 指定JDBC連接字符串 |
--connection-manager <class-name> | 指定要使用的連接管理器類 |
--driver <class-name> | 手動指定要使用的JDBC驅動程序類 |
--hadoop-mapred-home <dir> | 覆蓋$HADOOP_MAPRED_HOME變量 |
--help | 打印使用說明 |
--password-file | 為包含身份驗證密碼的文件設置路徑 |
-P | 從控制臺讀取密碼 |
--password <password> | 設置身份驗證密碼 |
--username <username> | 設置身份驗證用戶名 |
--verbose | 工作時打印更多信息 |
--connection-param-file <filename> | 提供連接參數的可選屬性文件 |
--relaxed-isolation | 設置連接事務隔離,以便為映射器讀取未提交的數據。 |
a、默認情況下,Sqoop使用映射器中的讀提交事務隔離來導入數據。這在所有ETL工作流中可能不是理想的,可能需要減少隔離保證。
--relaxed-isolation
選項可用于指示Sqoop使用read uncommitted隔離級別。所有數據庫(例如Oracle)不支持讀取未提交(read uncommitted)的隔離級別,因此指定選項--relaxed-isolation
可能不支持所有數據庫。
eg:
sqoop import --connect jdbc:mysql://database.example.com/employees --username aaron --password 12345
#Sqoop將讀取密碼文件的全部內容,并將其用作密碼。這將包括任何尾隨的空白字符,例如大多數文本編輯器默認添加的新行字符。您需要確保您的密碼文件只包含屬于您的密碼的字符。
#在命令行上,您可以使用帶有開關-n的命令echo來存儲密碼,而不需要任何尾隨的空格字符。例如,要存儲密碼secret,可以調用echo -n“secret”> .file。
$ sqoop import --connect jdbc:mysql://database.example.com/employees --username venkatesh --password-file ${user.home}/.password
- 更詳細的驗證參數
參數 | 描述 |
---|---|
--validate | 啟用數據復制的驗證,只支持單表復制。 |
--validator <class-name> | 指定要使用的validator類。 |
--validation-threshold <class-name> | 指定要使用的驗證閾值類。 |
--validation-failurehandler <class-name> | 指定要使用的驗證失敗處理程序類。 |
- 導入控制參數
參數 | 描述 |
---|---|
--append | 將數據附加到HDFS中的現有數據集 |
--as-avrodatafile | 導入數據到Avro數據文件 |
--as-sequencefile | 將數據導入sequencefile |
--as-textfile | 將數據導入為純文本(默認) |
--as-parquetfile | 將數據導入拼花地板文件 |
--boundary-query <statement> | 用于創建分割的邊界查詢 |
--columns <col,col,col…> | 要從表導入的列 |
--delete-target-dir | 如果導入目標目錄存在則刪除 |
--direct | 如果數據庫存在,則使用direct(直)連接器 |
--fetch-size <n> | 一次從數據庫讀取的條目數。 |
--inline-lob-limit <n> | 設置內聯LOB的最大大小 |
-m,--num-mappers <n> | 使用n個映射任務并行導入 |
-e,--query <statement> | 導入語句的結果。 |
--split-by <column-name> | 用于分隔工作單元的表的列。不能與--autoreset-to-one-mapper選項一起使用。 |
--split-limit <n> | 每個分割大小的上限。這只適用于整型和日期列。對于日期或時間戳字段,它以秒計算。 |
--autoreset-to-one-mapper | 如果一個表沒有主鍵,也沒有提供按列拆分,導入應該使用一個映射器。不能與--split-by <col>選項一起使用。 |
--table <table-name> | 要讀的表 |
--target-dir <dir> | HDFS目的地dir |
--temporary-rootdir <dir> | 用于導入期間創建的臨時文件的HDFS目錄(覆蓋默認的“_sqoop”) |
--warehouse-dir <dir> | 表目標的HDFS父節點 |
--where <where clause> | 在導入過程中使用WHERE子句 |
-z,--compress | 啟用壓縮 |
--compression-codec <c> | 使用Hadoop編解碼器(默認gzip) |
--null-string <null-string> | 為字符串列的空值編寫的字符串 |
--null-non-string <null-string> | 為非字符串列的null值編寫的字符串 |
a、 --null-string和--null-non-string 參數是可選的。如果沒有指定,那么將使用字符串“null”。
b、 當通過Oozie啟動Sqoop命令時,使用選項--skip-dist-cache
將跳過Sqoop將依賴項復制到作業緩存并保存大量I/O的步驟。(控制分布式緩存)
c、默認情況下,導入過程將使用JDBC,一些數據庫可以使用特定于數據庫的數據移動工具以更高性能的方式執行導入。例如,MySQL提供了mysqldump工具,它可以非常快速地將數據從MySQL導出到其他系統。通過提--direct參數
,您指定Sqoop應該嘗試直接導入通道。這個通道可能比使用JDBC的性能更高。
d、默認情況下,Sqoop會將一個名為foo的表導入到HDFS中主目錄中的一個名為foo的目錄中。例如,如果您的用戶名是someuser,那么導入工具將寫入/user/someuser/foo/(files)。您可以使用--warehouse-dir
參數調整導入的父目錄。或者顯式地指定目標目錄--target-dir
。--target-dir
和--warehouse-dir
互不兼容。
e、默認情況下,導入將轉到新的目標位置。如果目標目錄已經存在于HDFS中,Sqoop將拒絕導入和覆蓋該目錄的內容。如果使用——append參數,Sqoop將把數據導入臨時目錄,然后將文件重命名為普通目標目錄,其方式不會與該目錄中的現有文件名沖突。
f、當sqoop從企業存儲導入數據時,表名和列名可能具有不是有效Java標識符或Avro/Parquet標識符的字符。為了解決這個問題,sqoop將這些字符轉換為作為模式創建的一部分。任何以(下劃線)字符開頭的列名都將被轉換為兩個下劃線字符。例如,_AVRO將被轉換為__AVRO。在HCatalog導入的情況下,當映射到HCatalog列時,列名將轉換為小寫。這種情況在未來可能會改變。
g、默認情況下,數據沒有壓縮。您可以使用-z或-compress參數的deflate (gzip)算法壓縮數據,或者使用-compression-codec
參數指定任何Hadoop壓縮編解碼器。這適用于SequenceFile、text和Avro文件。
h、分隔文本是默認的導入格式。您還可以使用--as-textfile
參數顯式地指定它。該參數將把每個記錄的基于字符串的表示形式寫入輸出文件,在各個列和行之間使用分隔符。這些分隔符可以是逗號、制表符或其他字符。(可以選擇分隔符
eg:
選擇列數據導入
sqoop import ... --columns "name,employee_id,jobtitle" --where "id > 400" ...
自由格式的查詢導入
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
在使用direct模式時,可以指定應該傳遞給底層工具的其他參數。如果參數--
在命令行上給出,那么后續參數將直接發送到底層工具。例如,下面調整mysqldump使用的字符集:
sqoop import --connect jdbc:mysql://server.foo.com/db --table bar --direct -- --default-character-set=latin1
注意:
$CONDITIONS是必須條件存在于--query
a、如果使用雙引號(")包裝查詢,則必須使用\$CONDITIONS而不是僅使用$CONDITIONS來禁止shell將其視為shell變量(即使用斜桿轉義)。例如,雙引號查詢可能類似于:“SELECT * FROM x WHERE a='foo' AND \$CONDITIONS”。
b、在當前版本的Sqoop中使用自由形式查詢的功能僅限于簡單查詢,其中沒有不明確的投影,where子句中沒有OR條件。使用復雜的查詢(例如具有子查詢或連接的查詢)會導致不明確的投影,從而導致意外的結果。
- 控制類型映射參數
參數 | 描述 |
---|---|
--map-column-java <mapping> | 為已配置列覆蓋從SQL到Java類型的映射。 |
--map-column-hive <mapping> | 為配置的列覆蓋從SQL到Hive類型的映射。 |
eg: <name of column>=<new type>
sqoop import ... --map-column-java id=String,value=Integer
- 增量導入參數
參數 | 描述 |
---|---|
--check-column (col) | 指定在決定導入哪些行時要檢查的列。(該列不應該是CHAR/NCHAR/VARCHAR/VARNCHAR/ LONGVARCHAR/LONGNVARCHAR類型) |
--incremental (mode) | 指定Sqoop如何確定哪些行是新的。模式的合法值包括append和lastmodified。 |
--last-value (value) | 指定上一個導入的檢查列的最大值。 |
- 大對象
參數 | 描述 |
---|---|
輸出行格式化參數: | |
--enclosed-by <char> | 設置所需的字段包圍字符 |
--escaped-by <char> | 設置轉義字符 |
--fields-terminated-by <char> | 設置字段分隔符字符\b (backspace) \n (newline) \r (carriage return) \t (tab) " (double-quote) \' (single-quote) \ (backslash) \0 (NUL) |
--lines-terminated-by <char> | 設置行尾字符 |
--mysql-delimiters | 使用MySQL的默認分隔符set: fields:, lines: \n escape -by: \ option -enclosed-by: ' |
--optionally-enclosed-by <char> | 設置一個字段包圍字符 |
輸入解析參數: | |
--input-enclosed-by <char> | 設置所需的字段外殼 |
--input-escaped-by <char> | 設置輸入轉義字符 |
--input-fields-terminated-by <char> | 設置輸入字段分隔符 |
--input-lines-terminated-by <char> | 設置輸入行結束符 |
--input-optionally-enclosed-by <char> | 設置一個字段包圍字符 |
a、Sqoop以特定的方式處理大型對象(BLOB和CLOB列)。如果這個數據確實很大,那么這些列不應該像大多數列那樣在內存中完全物化以便操作。相反,它們的數據以流方式處理。大型對象可以與其他數據一起內聯存儲,在這種情況下,它們在每次訪問時都在內存中完全物化,或者它們可以存儲在連接到主數據存儲的輔助存儲文件中。默認情況下,小于16mb的大型對象與其他數據一起存儲。在較大的尺寸下,它們存儲在導入目標目錄的_lobs子目錄中的文件中。這些文件存儲在一個單獨的格式優化大型記錄存儲,可容納2 ^ 63字節的記錄。lob溢出到單獨文件中的大小由
--inline-lob-limit
參數控制,該參數接受一個參數,該參數指定要保持內聯的最大lob大小(以字節為單位)。如果將內聯LOB限制設置為0,則所有大型對象都將放置在外部存儲中。
b、即使Hive支持轉義字符,它也不能處理換行字符的轉義。此外,它不支持在封閉的字符串中包含字段分隔符的封閉字符的概念。因此,建議您在使用Hive時選擇無歧義字段和記錄終止分隔符,而不需要轉義和包圍字符;這是由于Hive的輸入解析能力的限制
c、當Sqoop將數據導入到HDFS時,它會生成一個Java類,該類可以重新解釋在執行分隔格式導入時創建的文本文件。分隔符是用參數選擇的,例如--fields-terminated-by
;它控制如何將數據寫到磁盤,以及生成的parse()方法如何重新解釋這些數據。parse()方法使用的分隔符可以獨立于輸出參數進行選擇,方法是使用--input-field -terminated-by
,等等。例如,這對于生成可以解析用一組分隔符創建的記錄并發出t的類非常有用
eg:
sqoop import --optionally-enclosed-by '\"' (the rest as above)...
- 將數據導入Hive參數
參數 | 描述 |
---|---|
--hive-home <dir> | 重寫覆蓋$HIVE_HOME變量 |
--hive-import | 將表導入Hive(如果沒有設置任何分隔符,則使用Hive的默認分隔符)。 |
--hive-overwrite | 覆蓋Hive表中的現有數據。 |
--create-hive-table | 如果設置,那么如果目標hive表存在,作業將失敗。默認情況下,此屬性為false。 |
--hive-table <table-name> | 設置導入到Hive時要使用的表名。 |
--hive-drop-import-delims | 將\n、\r和\01從字符串字段導入到Hive時去除。 |
--hive-delims-replacement | 將\n、\r和\01從字符串字段導入到Hive時用用戶定義的字符串替換。 |
--hive-partition-key | 要分區的hive字段的名稱被切分 |
--hive-partition-value <v> | 字符串值,作為在此作業中導入到hive的分區鍵。 |
--map-column-hive <map> | 為配置的列覆蓋從SQL類型到Hive類型的默認映射。如果在這個參數中指定逗號,則使用URL編碼的鍵和值,例如,使用DECIMAL(1%2C%201)而不是DECIMAL(1,1)。 |
Sqoop導入工具的主要功能是將數據上傳到HDFS中的文件中。如果您有一個與HDFS集群關聯的Hive元數據存儲,Sqoop還可以通過生成和執行CREATE TABLE語句將數據導入到Hive中,以定義數據在Hive中的布局。將數據導入Hive非常簡單,只需--hive-import
選項添加到Sqoop命令行即可。
如果Hive表已經存在,您可以指定--hive-overwrite
選項,以指示必須替換Hive中現有的表。將數據導入HDFS或省略此步驟后,Sqoop將生成一個Hive腳本,其中包含一個使用Hive類型定義列的CREATE TABLE操作,以及一個LOAD DATA INPATH
語句,用于將數據文件移動到Hive 的 warehouse目錄中。腳本將通過調用Sqoop運行的機器上安裝的hive副本來執行。如果您有多個Hive安裝,或者Hive不在$PATH中,請使用--hive-home
選項來標識Hive安裝目錄。Sqoop將從這里使用$HIVE_HOME/bin/hive
。
注意:
a、導入hive不兼容--as-avrodatafile 和 --as-sequencefile參數。
即使Hive支持轉義字符,它也不能處理換行字符的轉義。此外,它不支持在封閉的字符串中包含字段分隔符的封閉字符的概念。因此,建議您在使用Hive時選擇無歧義字段和記錄終止分隔符,而不需要轉義和包圍字符;這是由于Hive的輸入解析能力的限制。如果在將數據導入Hive時確實使用了-escape -by、- encloed -by或-option - encloed -by, Sqoop將打印一條警告消息。
如果數據庫的行包含包含Hive默認行分隔符(\n和\r字符)或列分隔符(\01字符)的字符串字段,那么Hive在使用sqoop導入的數據時會遇到問題。可以使用-hive-drop-import-delims
選項在導入時刪除這些字符,以提供與hive兼容的文本數據。或者,您可以使用--hive-delims-replacement
選項,在導入時將這些字符替換為用戶定義的字符串,以提供與hive兼容的文本數據。只有在使用Hive的默認分隔符時才應該使用這些選項,如果指定了不同的分隔符,則不應該使用這些選項。
Sqoop將字段和記錄分隔符傳遞到Hive。如果你不設置任何分隔符和使用--hive-import
,字段分隔符將被設置為^A
和記錄分隔符將被設置為\ n
與hive的默認分隔符是一致的。
Sqoop將默認導入NULL值作為字符串NULL。然而,Hive使用字符串\N
來表示NULL值,因此處理NULL(比如is NULL)的謂詞將不能正確工作。如果您希望正確地保留NULL值,那么在導入作業中應該附加參數--null-string
和--null-non-string
,或者在導出作業中附加參數--input-null-string
和--input-null-non-string
。由于sqoop在生成的代碼中使用了這些參數,您需要正確地將值\N
轉義到\\N
:
sqoop import ... --null-string '\\N' --null-non-string '\\N'
默認情況下,Hive中使用的表名與源表的表名相同。您可以使用--hive-table
選項控制輸出表名。
Hive可以將數據放入分區,以獲得更高效的查詢性能。通過指定—分分區鍵和—分分區值參數,可以告訴Sqoop作業將Hive的數據導入到特定分區。分區值必須是字符串。有關分區的詳細信息,請參閱Hive文檔。
您可以使用--compress
和--compression-codec
選項將壓縮表導入Hive。壓縮導入到Hive中的表的一個缺點是,許多編解碼器不能通過并行映射任務進行處理。然而,lzop編解碼器支持拆分。使用此編解碼器導入表時,Sqoop將自動索引文件,以便使用正確的InputFormat拆分和配置新的Hive表。這個特性目前要求用lzop編解碼器壓縮表的所有分區。
- 將數據導入Hbase參數
參數 | 描述 |
---|---|
--column-family <family> | 為導入設置目標列族 |
--hbase-create-table | 如果指定,則創建丟失的HBase表 |
--hbase-row-key <col> | 指定將哪個輸入列用作行鍵。如果輸入表包含復合鍵,那么<col>必須以逗號分隔的復合鍵屬性列表的形式出現 |
--hbase-table <table-name> | 指定要用作目標的HBase表,而不是HDFS |
--hbase-bulkload | 支持批量加載 |
通過指定--hbase-table
,可以指示Sqoop導入HBase中的表,而不是HDFS中的目錄。Sqoop將數據導入到指定的表中,作為-hbase-table
的參數。輸入表的每一行將被轉換為輸出表的一行的HBase Put操作。每一行的鍵是從輸入的一列中獲取的。默認情況下,Sqoop將使用按分列作為行鍵列。如果沒有指定,它將嘗試標識源表的主鍵列(如果有的話)。您可以使--hbase-row-key
手動指定行鍵列。每個輸出列將放置在相同的列族中,必須使用--column-family
指定。
注意:
導入hbase不支持--direct
參數
如果輸入表具有復合鍵,那么--hbase-row-key
必須以逗號分隔的復合鍵屬性列表的形式出現。在這種情況下,HBase行的行鍵將通過使用下劃線作為分隔符組合組合鍵屬性的值生成。注意:只有在指定了參--hbase-row-key
時,具有組合鍵的表的Sqoop導入才能工作。
如果目標表和列族不存在,Sqoop作業將退出,并出現錯誤。您應該在運行導入之前創建目標表和列系列。如果指定--hbase-create-table
, Sqoop將使用HBase配置中的默認參數,在目標表和列系列不存在的情況下創建它們。
Sqoop當前將所有值序列化為HBase,方法是將每個字段轉換為其字符串表示形式(就像以文本模式導入HDFS一樣),然后將該字符串的UTF-8字節插入目標單元格。Sqoop將跳過除行鍵列之外的所有列中包含空值的所有行。
為了減少hbase上的負載,Sqoop可以進行批量加載,而不是直接寫操作。若要使用批量加載,請啟--hbase-bulkload
。
導入數據到Accumulo
略,詳情>>其他導入屬性配置
參數 | 描述 |
---|---|
sqoop.bigdecimal.format.string | 控件將BigDecimal列存儲為字符串時如何格式化。true(默認值)將使用toPlainString來存儲它們,而不使用指數組件(0.0000001);而false的值將使用toString,該字符串可能包含指數(1E-7) |
sqoop.hbase.add.row.key | 當設置為false(默認)時,Sqoop不會將用作行鍵的列添加到HBase中的行數據中。當設置為true時,用作行鍵的列將被添加到HBase中的行數據中。 |
sqoop import -D property.name=property.value ...
或者修改conf/sqoop-site.xml
<property>
<name>property.name</name>
<value>property.value</value>
</property>
完整示例1:mysql導入hbase
import
--connect
jdbc:mysql://host:3306/database
--username
'user'
--password
'pwd'
--query
'SELECT concat_ws("_",meter_id,DATE_FORMAT(create_time,"%Y%m%d%H%i%s")) AS row_key,meter_id,active_quan,create_time,flag FROM elec_meter_data_2018 WHERE create_time>="2018-09-01 00:00:00" AND create_time<"2018-10-01 00:00:00" AND $CONDITIONS'
--hbase-table
elec_meter_data
--hbase-create-table
--hbase-row-key
row_key
-m
3
--column-family
cf1
--split-by
create_time
2.1.2 sqoop-export
- 連接數據庫參數
參數 | 描述 |
---|---|
--connect <jdbc-uri> | 指定JDBC連接字符串 |
--connection-manager <class-name> | 指定要使用的連接管理器類 |
--driver <class-name> | 手動指定要使用的JDBC驅動程序類 |
--hadoop-mapred-home <dir> | 覆蓋$HADOOP_MAPRED_HOME變量 |
--help | 打印使用說明 |
--password-file | 為包含身份驗證密碼的文件設置路徑 |
-P | 從控制臺讀取密碼 |
--password <password> | 設置身份驗證密碼 |
--username <username> | 設置身份驗證用戶名 |
--verbose | 工作時打印更多信息 |
--connection-param-file <filename> | 提供連接參數的可選屬性文件 |
--relaxed-isolation | 設置連接事務隔離,以便為映射器讀取未提交的數據。 |
- 更詳細的驗證參數
參數 | 描述 |
---|---|
--validate | 啟用數據復制的驗證,只支持單表復制。 |
--validator <class-name> | 指定要使用的validator類。 |
--validation-threshold <class-name> | 指定要使用的驗證閾值類。 |
--validation-failurehandler <class-name> | 指定要使用的驗證失敗處理程序類。 |
- 導出控制參數
參數 | 描述 |
---|---|
--columns <col,col,col…> | 要導出到表的列 |
--direct | 使用直接導出快捷路徑 |
--export-dir <dir> | 導出的HDFS源路徑 |
-m,--num-mappers <n> | 使用n個映射任務并行導出 |
--table <table-name> | 導出寫入的表 |
--call <stored-proc-name> | 要調用的存儲過程 |
--update-key <col-name> | 用于更新的固定列。如果有多個列,則使用逗號分隔的列列表。 |
--update-mode <mode> | 指定在數據庫中發現具有不匹配鍵的新行時如何執行更新。模式的合法值包括updateonly(默認值)和allowinsert |
--input-null-string <null-string> | 字符串列被解釋為null的字符串 |
--input-null-non-string <null-string> | 對于非字符串列,要解釋為null的字符串 |
--staging-table <staging-table-name> | 數據插入目標表之前將在其中分段的表。 |
--clear-staging-table | 指示可以刪除暫存表中出現的任何數據。 |
--batch | 使用批處理模式執行底層語句。 |
a、默認情況下,選擇表中的所有列進行導出。可以使用
--columns
參數選擇列的子集并控制它們的順序。這應該包括一個以逗號分隔的要導出的列列表。例如:--columns “col1、col2、col3”
。注意--columns
參數中不包含的列需要定義默認值或允許空值。否則,您的數據庫將拒絕導入的數據,從而導致Sqoop作業失敗。
b、直接導出并不總是支持將數據推入目標表之前的分段數據。當使用·--update-key·選項(用于更新現有數據)調用導出時,以及當使用存儲過程插入數據時,它也不可用。 It is best to check the Section 25, “Notes for specific connectors” section to validate.
- 更新和插入(Inserts vs. Updates)
默認情況下,sqoop-export向表添加新行;將每個輸入記錄轉換為一條INSERT語句,該語句將一行添加到目標數據庫表中。如果您的表有約束(例如,主鍵列的值必須是惟一的),并且已經包含數據,則必須小心避免插入違反這些約束的記錄。如果插入語句失敗,導出過程將失敗。如果指定
--update-key
參數,Sqoop將修改數據庫中的現有數據集。每個輸入記錄都被視為修改現有行的UPDATE語句。語句修改的行由--update-key
指定的列名確定。
- 輸入解析參數
參數 | 描述 |
---|---|
--input-enclosed-by <char> | 設置所需的字段外殼 |
--input-escaped-by <char> | 設置輸入轉義字符 |
--input-fields-terminated-by <char> | 設置輸入字段分隔符 |
--input-lines-terminated-by <char> | 設置輸入行結束符 |
--input-optionally-enclosed-by <char> | 設置一個字段包圍字符 |
- 輸出行格式化參數
參數 | 描述 |
---|---|
--enclosed-by <char> | 設置所需的字段包圍字符 |
--escaped-by <char> | 設置轉義字符 |
--fields-terminated-by <char> | 設置字段分隔符字符\b (backspace) \n (newline) \r (carriage return) \t (tab) " (double-quote) ' (single-quote) \ (backslash) \0 (NUL) |
--lines-terminated-by <char> | 設置行尾字符 |
--mysql-delimiters | 使用MySQL的默認分隔符set: fields:, lines: \n escape -by: \ option -enclosed-by: ' |
--optionally-enclosed-by <char> | 設置一個字段包圍字符 |
- 代碼生成參數
參數 | 描述 |
---|---|
--bindir <dir> | 編譯對象的輸出目錄 |
--class-name <name> | 設置生成的類名。這個覆蓋--package-name。當與--jar-file組合時,設置輸入類。 |
--jar-file <file> | 禁用代碼生成;使用指定的jar |
--outdir <dir> | 生成代碼的輸出目錄 |
--package-name <name> | 將自動生成的類放到這個包中 |
--map-column-java <m> | 為已配置列覆蓋從SQL類型到Java類型的默認映射。 |
示例1: 導出hive到mysql
export
--connect
jdbc:mysql://xxx:3306/xxx
--username
xxx
--password
xxx
--table
hive_tbname
--direct
--export-dir
/output/t_class --driver com.mysql.jdbc.Driver
--input-fields-terminated-by
'\t'
--lines-terminated-by
'\n'
2.1.3 sqoop-job
作業記住用于指定作業的參數,因此可以通過調用作業的句柄重新執行這些參數。
如果將保存的作業配置為執行增量導入,則有關最近導入的行的狀態將在保存的作業中更新,以允許作業僅持續導入最新的行。
待續