一、export
1、export概述
export工具將一組文件從HDFS導入到RDBMS。目標表必須已經存在於數據庫中。根據用戶指定的分隔符讀取輸入文件並將其解析為一組記錄, 只有map; [root@hadoop-senior sqoop-1.4.5-cdh5.3.6]# bin/sqoop help export sqoop-export有三種模式: 默認模式:將它們轉換為一組將INSERT語句注入數據庫的語句。 更新模式:Sqoop將生成UPDATE替換數據庫中現有記錄的語句。 調用模式:Sqoop將為每條記錄創建一個存儲過程調用。
2、語法參數
sqoop-export有兩種語法: sqoop export (generic-args) (export-args) sqoop-export (generic-args) (export-args) ##常用參數: --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>:指定要使用的驗證程序類。 --validation-threshold <class-name>:指定要使用的驗證閾值類。 --validation-failurehandler <class-name>:指定要使用的驗證失敗處理程序類。 ##導出控制參數 --columns <col,col,col…>:要導出到表格的列。 --direct:使用直接導出快速路徑。 --export-dir <dir>:用於導出的HDFS源路徑。 -m,--num-mappers <n>:使用n個mapper任務並行導出。 --table <table-name>:要填充的表。 --call <stored-proc-name>:存儲過程調用。 --update-key <col-name>:錨點列用於更新。如果有多個列,請使用以逗號分隔的列列表。 --update-mode <mode>:指定在數據庫中使用不匹配的鍵找到新行時如何執行更新。mode包含的updateonly默認值(默認)和allowinsert。 --input-null-string <null-string>:字符串列被解釋為空的字符串。 --input-null-non-string <null-string>:要對非字符串列解釋為空的字符串。 --staging-table <staging-table-name>:數據在插入目標表之前將在其中展開的表格。 --clear-staging-table:表示可以刪除登台表中的任何數據。 --batch:使用批處理模式執行基礎語句。 #############詳解############# 一條導出語句中,必須有--export-dir參數和一個--table或者--call參數。這些指定要填充到數據庫(或要調用的存儲過程)的表以及HDFS中包含源數據的目錄。 1、 --columns參數選擇列並控制它們的排序。 默認情況下,表格中的所有列都被選中用於導出。以逗號為間隔選擇和排列各個列。 例如:--columns "col1,col2,col3" 注意:--columns參數中不包含的列需要定義默認值或允許NULL值。否則,數據庫將拒絕導入數據,從而導致sqoop導入失敗。 2、 --num-mappers或-m 參數控制mapper任務的數量。默認情況下,Sqoop將為導出過程提供4個並行任務。 也可以根據目錄中存在的文件數來控制mapper的數量。導出性能取決於並行度。 如果數據庫已經在更新索引,調用觸發器等方面遇到瓶頸,則額外的負載可能會降低性能。 3、 dircet模式 --direct參數來指定direct模式的代碼路徑。此項可能比標准JDBC的性能更高。 4、 字符串轉換 --input-null-string和--input-null-non-string參數都是可選的。如果--input-null-string未指定,那么對於字符串類型的列,字符串“null”將被解釋為空。如果--input-null-non-string未指定,則字符串“null”和空字符串將被解釋為非字符串列的空值。 注意,除了由--input-null-non-string參數指定外,空字符串將始終被解釋為非字符串列的空值。 5、 指定分段表 --staging-table選項充當用於分階段導出數據的輔助表。 由於Sqoop將導出過程分解為多個事務,導致失敗的導出作業可能導致部分數據被提交給數據庫。這可能進一步導致后續作業由於在某些情況下插入沖突而失敗,或導致其他數據中的重復數據。那么這種情況下就可以通過指定臨時表來解決此問題,該階段性數據最終在單個事務中移動到目標表中。 為了使用分段工具,您必須在運行導出作業之前創建分段表。該表必須在結構上與目標表相同。此表應該在導出作業運行之前為空,或者--clear-staging-table必須指定該選項。如果臨時表包含數據並且指定了--clear-staging-table選項,則Sqoop將在開始導出作業之前刪除分段表中所有數據。 注意:在將數據導入目標表之前支持暫存數據,但是不可用於--direct導出。--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>:設置字段分隔符。 --lines-terminated-by <char>:設置行尾字符。 --mysql-delimiters:使用MySQL的默認分隔符集:fields:, lines:\n escaped-by:\ optional-enclosed-by:'。 --optionally-enclosed-by <char>:設置字段包含字符。 Sqoop會自動生成代碼來解析和解釋包含要導出到數據庫的數據的文件記錄。如果這些文件是使用非默認分隔符(以換行符分隔的記錄的逗號分隔字段)創建的,則應該再次指定相同的分隔符,以便Sqoop可以解析您的文件。 如果指定了不正確的分隔符,則Sqoop將無法在每行中找到足夠的列。這會導致導出mapper任務失敗並拋出異常:ParseExceptions。 ##代碼生成參數 --bindir <dir>:編譯對象的輸出目錄。 --class-name <name>:設置生成的類名稱。這覆蓋--package-name。與之結合使用時--jar-file,設置輸入類。 --jar-file <file>:禁用代碼生成;使用指定的jar。 --outdir <dir>:生成代碼的輸出目錄。 --package-name <name>:將自動生成的類放入此包中。 --map-column-java <m>:覆蓋已配置列的從SQL類型到Java類型的默認映射。 如果要導出的記錄是作為先前導入的結果生成的,則可以使用原始生成的類讀取數據。在這種情況下指定--jar-file和--class-name避免指定分隔符。 現有生成的代碼的使用與--update-key是不兼容的;更新模式導出需要新的代碼生成來執行更新。也不能使用--jar-file參數,並且必須完全指定任何非默認分隔符。
二、export使用
1、從HDFS導入到mysql
##准備數據 [root@hadoop-senior ~]# touch /opt/datas/user.txt [root@hadoop-senior ~]# vim !$ 12,beifeng,beifeng 13,xuanyun,xuanyu ##上傳到hdfs [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -mkdir -p /user/root/sqoop/exp/user/ [root@hadoop-senior hadoop-2.5.0-cdh5.3.6]# bin/hdfs dfs -put /opt/datas/user.txt /user/root/sqoop/exp/user/ ##導入到mysql bin/sqoop export \ --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \ --username root \ --password 123456 \ --table my_user \ --export-dir /user/root/sqoop/exp/user/ \ --num-mappers 1
##查詢,已經導入了 mysql> select * from my_user; +----+---------+---------+ | id | account | passwd | +----+---------+---------+ | 1 | admin | admin | | 2 | pu | 12345 | | 3 | system | system | | 4 | zxh | zxh | | 5 | test | test | | 6 | pudong | pudong | | 7 | qiqi | qiqi | | 12 | beifeng | beifeng | | 13 | xuanyun | xuanyu | +----+---------+---------+ 9 rows in set (0.00 sec)
三、將RDBMS表中的數據導入到Hive表中
因為Hive數據存儲在hdfs上,底層原理類似於hdfs-->RDBMS;
RDBMS—>HDFS—>Hive
先將數據導入到hdfs,再load data到hive;
##創建hive表,這里用SQL文件的方式 [root@hadoop-senior ~]# touch /opt/datas/imp-hive-user.sql [root@hadoop-senior ~]# vim /opt/datas/imp-hive-user.sql use default ; drop table if exists user_hive ; create table user_hive( id int, account string, password string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ; [root@hadoop-senior hive-0.13.1-cdh5.3.6]# bin/hive -f /opt/datas/imp-hive-user.sql hive (default)> show tables; user_hive ##將mysql數據導入到hive表中 bin/sqoop import \ --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \ --username root \ --password 123456 \ --table my_user \ --fields-terminated-by '\t' \ --delete-target-dir \ --num-mappers 1 \ --hive-import \ --hive-database default \ --hive-table user_hive #在hive中查詢,有數據了 hive (default)> select * from user_hive; OK user_hive.id user_hive.account user_hive.password 1 admin admin 2 pu 12345 3 system system 4 zxh zxh 5 test test 6 pudong pudong 7 qiqi qiqi 12 beifeng beifeng 13 xuanyun xuanyu Time taken: 0.045 seconds, Fetched: 9 row(s)
四、導出Hive表中數據到RDBMS中
##創建mysql表 CREATE TABLE `my_user2` ( `id` tinyint(4) NOT NULL AUTO_INCREMENT, `account` varchar(255) DEFAULT NULL, `passwd` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ); mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | my_user | | my_user2 | +----------------+ 2 rows in set (0.00 sec) ##導入到mysql bin/sqoop export \ --connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \ --username root \ --password 123456 \ --table my_user2 \ --export-dir /user/hive/warehouse/user_hive \ --num-mappers 1 \ --input-fields-terminated-by '\t' ##mysql查詢 mysql> select * from my_user2; +----+---------+---------+ | id | account | passwd | +----+---------+---------+ | 1 | admin | admin | | 2 | pu | 12345 | | 3 | system | system | | 4 | zxh | zxh | | 5 | test | test | | 6 | pudong | pudong | | 7 | qiqi | qiqi | | 12 | beifeng | beifeng | | 13 | xuanyun | xuanyu | +----+---------+---------+ 9 rows in set (0.00 sec)
轉自:https://www.cnblogs.com/weiyiming007/p/10824299.html