1、指定導入到HDFS文件系統中數據分隔符,默認使用逗號進行分隔
示例以製表符"\t"進行分隔
[root@hadoop-server01 lib]# sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor --fields-terminated-by '\t'
[root@hadoop-server01 lihadoop fs -ls /user/root/actor
Found 5 items
-rw-r--r-- 1 root supergroup 0 2018-07-09 06:20 /user/root/actor/_SUCCESS
-rw-r--r-- 1 root supergroup 1911 2018-07-09 06:20 /user/root/actor/part-m-00000
-rw-r--r-- 1 root supergroup 1929 2018-07-09 06:20 /user/root/actor/part-m-00001
-rw-r--r-- 1 root supergroup 1978 2018-07-09 06:20 /user/root/actor/part-m-00002
-rw-r--r-- 1 root supergroup 1981 2018-07-09 06:20 /user/root/actor/part-m-00003
[root@hadoop-server01 lib]# hadoop fs -cat /user/root/actor/part-m-00000
1 PENELOPE GUINESS 2006-02-15 04:34:33.0
2 NICK WAHLBERG 2006-02-15 04:34:33.0
3 ED CHASE 2006-02-15 04:34:33.0
4 JENNIFER DAVIS 2006-02-15 04:34:33.0
...省略數據
2、指定導入到HDFS文件系統中數據輸出路徑
[root@hadoop-server01 lib]# sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor --target-dir '/mysql/actor1' --fields-terminated-by ','
如下所示,沒有采用默認輸出路徑,使用了我們指定的輸出路徑 /mysql/actor1
[root@hadoop-server01 lib]# hadoop fs -ls /mysql/actor1
Found 5 items
-rw-r--r-- 1 root supergroup 0 2018-07-09 06:24 /mysql/actor1/_SUCCESS
-rw-r--r-- 1 root supergroup 1911 2018-07-09 06:24 /mysql/actor1/part-m-00000
-rw-r--r-- 1 root supergroup 1929 2018-07-09 06:24 /mysql/actor1/part-m-00001
-rw-r--r-- 1 root supergroup 1978 2018-07-09 06:24 /mysql/actor1/part-m-00002
-rw-r--r-- 1 root supergroup 1981 2018-07-09 06:24 /mysql/actor1/part-m-00003
3、指定MapTask數量,通過指定MapTask數量,可以靈活控制執行的MapTask線程數,可以根據輸入遷移表大小合理控制程序執行效率,使用 -m number參數
[root@hadoop-server01 lib]# sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor --target-dir '/mysql/actor2' --fields-terminated-by ',' -m 2
這裏指定-m 2 表示採用2個MapTask線程執行。
18/07/09 06:28:14 INFO mapreduce.JobSubmitter: number of splits:2 表示控制生效,採用了2個MapTask線程執行
[root@hadoop-server01 lib]# hadoop fs -ls /mysql/actor2
Found 3 items
-rw-r--r-- 1 root supergroup 0 2018-07-09 06:28 /mysql/actor2/_SUCCESS
-rw-r--r-- 1 root supergroup 3840 2018-07-09 06:28 /mysql/actor2/part-m-00000
-rw-r--r-- 1 root supergroup 3959 2018-07-09 06:28 /mysql/actor2/part-m-00001
輸出爲2個文件,說明指定MapTask參數生效
4、增加where條件進行數據遷移
[root@hadoop-server01 lib]# sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor --target-dir '/mysql/actor3' --fields-terminated-by ',' -m 1 --where 'actor_id between 20 and 50'
[root@hadoop-server01 lib]# hadoop fs -ls /mysql/actor3
Found 2 items
-rw-r--r-- 1 root supergroup 0 2018-07-09 06:36 /mysql/actor3/_SUCCESS
-rw-r--r-- 1 root supergroup 1193 2018-07-09 06:36 /mysql/actor3/part-m-00000
[root@hadoop-server01 lib]# hadoop fs -cat /mysql/actor3/part-m-00000
20,LUCILLE,TRACY,2006-02-15 04:34:33.0
21,KIRSTEN,PALTROW,2006-02-15 04:34:33.0
22,ELVIS,MARX,2006-02-15 04:34:33.0
.....省略部分數據
47,JULIA,BARRYMORE,2006-02-15 04:34:33.0
48,FRANCES,DAY-LEWIS,2006-02-15 04:34:33.0
49,ANNE,CRONYN,2006-02-15 04:34:33.0
50,NATALIE,HOPKINS,2006-02-15 04:34:33.0
輸出符合過濾條件
5、query語句
query語句更爲靈活,可以根據自定義導入字段,而不必導入全部字段
sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --target-dir '/mysql/actor3' --fields-terminated-by ',' -m 2 --query "SELECT actor_id,first_name,last_name FROM actor where first_name like 'D%' AND \$CONDITIONS" --split-by actor.first_name
說明:--query這個參數中的sql語句後面需要加上AND $CONDITIONS這個參數
--split-by actor. 指定按表的哪個字段進行分片,格式爲--split-by ${tablename.column},若指定的-m 參數爲1,則無需指定 --split-by參數,因爲默認爲一個分片。
特別注意點:--query參數和--table參數互斥,指定了--query參數後不能再指定--table參數
[root@hadoop-server01 lib]# hadoop fs -ls /mysql/actor3
Found 3 items
-rw-r--r-- 1 root supergroup 0 2018-07-09 07:12 /mysql/actor3/_SUCCESS
-rw-r--r-- 1 root supergroup 96 2018-07-09 07:12 /mysql/actor3/part-m-00000
-rw-r--r-- 1 root supergroup 17 2018-07-09 07:12 /mysql/actor3/part-m-00001
[root@hadoop-server01 lib]# hadoop fs -cat /mysql/actor3/part-m-00000
18,DAN,TORN
56,DAN,HARRIS
95,DARYL,WAHLBERG
116,DAN,STREEP
129,DARYL,CRAWFORD
182,DEBBIE,AKROYD
[root@hadoop-server01 lib]# hadoop fs -cat /mysql/actor3/part-m-00001
59,DUSTIN,TAUTOU
從導入結果可以看出滿足SQL查詢條件,把first_name中以D開頭名字全部查詢出來。且按照first_name字段進行了分片
6、壓縮參數
如果想要使得導入到hdfs上的數據被壓縮,就可以使用-z或者--compression-codec來進行壓縮,-z壓縮方式是gzip壓縮,--compression-codec可以自定義壓縮方式
sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor --target-dir '/mysql/actor6' --fields-terminated-by ',' -z
[root@hadoop-server01 lib]# hadoop fs -ls /mysql/actor6
Found 5 items
-rw-r--r-- 1 root supergroup 0 2018-07-09 07:19 /mysql/actor6/_SUCCESS
-rw-r--r-- 1 root supergroup 584 2018-07-09 07:19 /mysql/actor6/part-m-00000.gz
-rw-r--r-- 1 root supergroup 571 2018-07-09 07:19 /mysql/actor6/part-m-00001.gz
-rw-r--r-- 1 root supergroup 570 2018-07-09 07:19 /mysql/actor6/part-m-00002.gz
-rw-r--r-- 1 root supergroup 580 2018-07-09 07:19 /mysql/actor6/part-m-00003.gz
使用Snappy方式壓縮
sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor --target-dir '/mysql/actor6' --fields-terminated-by ',' --compression-codec org.apache.hadoop.io.compress.SnappyCodec
自定義壓縮
7、delete-target-dir參數
當再次執行sqoop語句的時候,會報錯,因爲 /mysql/actor6文件夾已經存在了,我們需要先刪除這個文件夾再運行sqoop語句。也可以使用sqoop提供的delete-target-dir參數。
sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor --target-dir '/mysql/actor6' --fields-terminated-by ',' --delete-target-dir
8、append參數
如果目標文件夾在hdfs上已經存在,那麼再次運行就會報錯。可以使用--delete-target-dir來先刪除目錄。也可以使用append來往目錄下追加數據。append和delete-target-dir是相互衝突的。
sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor --target-dir '/mysql/actor6' --fields-terminated-by ',' --append
[root@hadoop-server01 lib]# hadoop fs -ls /mysql/actor6
Found 9 items
-rw-r--r-- 1 root supergroup 0 2018-07-09 07:22 /mysql/actor6/_SUCCESS
-rw-r--r-- 1 root supergroup 1911 2018-07-09 07:22 /mysql/actor6/part-m-00000
-rw-r--r-- 1 root supergroup 1929 2018-07-09 07:22 /mysql/actor6/part-m-00001
-rw-r--r-- 1 root supergroup 1978 2018-07-09 07:22 /mysql/actor6/part-m-00002
-rw-r--r-- 1 root supergroup 1981 2018-07-09 07:22 /mysql/actor6/part-m-00003
-rw-r--r-- 1 root supergroup 1911 2018-07-09 07:24 /mysql/actor6/part-m-00004
-rw-r--r-- 1 root supergroup 1929 2018-07-09 07:24 /mysql/actor6/part-m-00005
-rw-r--r-- 1 root supergroup 1978 2018-07-09 07:24 /mysql/actor6/part-m-00006
-rw-r--r-- 1 root supergroup 1981 2018-07-09 07:24 /mysql/actor6/part-m-00007
4、5、6、7爲append的文件
9、空值處理
sqoop提供了--null-string來處理字符類型的空值,提供了--null-non-string來處理非字符類型的空值。
sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor --target-dir '/mysql/actor6' --fields-terminated-by ',' --null-string "" --null-non-string "false"
10、增量傳輸
增量導入的一個場景就是昨天導入了一批數據,今天又增加了部分數據,現在要把這部分數據也導入到hdfs中。
sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor --target-dir '/mysql/actor8' --fields-terminated-by ',' -m 1 --where 'actor_id between 20 and 25' --check-column "actor_id" --incremental append --last-value 5
Incremental import arguments:
--check-column <column> Source column to check for incremental change
--incremental <import-type> Define an incremental import of type 'append' or 'lastmodified'
--last-value <value> Last imported value in the incremental check column
sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor --target-dir '/mysql/actor9' --fields-terminated-by ',' -m 1
.......省略開頭數據
196,BELA,WALKEN,2006-02-15 04:34:33.0
197,REESE,WEST,2006-02-15 04:34:33.0
198,MARY,KEITEL,2006-02-15 04:34:33.0
199,JULIA,FAWCETT,2006-02-15 04:34:33.0
200,THORA,TEMPLE,2006-02-15 04:34:33.0
現在模擬在表中插入部分新增數據
mysql> insert into actor values (201,'Zhangsan','Zhang',' 2006-02-15 04:34:12');
Query OK, 1 row affected (0.02 sec)
mysql> insert into actor values (202,'Lisi','Lo',' 2006-02-15 04:34:12');
Query OK, 1 row affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)
mysql>
| 201 | Zhangsan | Zhang | 2006-02-15 04:34:12 |
| 202 | Lisi | Lo | 2006-02-15 04:34:12 |
+----------+-------------+--------------+---------------------+
現在執行
sqoop import --connect jdbc:mysql://hadoop-server03:3306/sakila --username sqoop --password hive#2018 --table actor --target-dir '/mysql/actor9' --fields-terminated-by ',' -m 1 --check-column "actor_id" --incremental append --last-value 200
[root@hadoop-server01 lib]# hadoop fs -cat /mysql/actor9/part-m-00001
201,Zhangsan,Zhang,2006-02-15 04:34:12.0
202,Lisi,Lo,2006-02-15 04:34:12.0
可以看出,新的輸出文件中只增加了我們在mysql中新增的兩條數據,這裏 --last-value 200值增量的檢查列的值,這裏的200就是增量actor_id=201前一個值