1. 程式人生 > 其它 >1.13-1.15 Sqoop匯出資料Export使用

1.13-1.15 Sqoop匯出資料Export使用

一、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)