sqoop簡單import使用


一、sqoop作用?

sqoop是一個數據交換工具,最常用的兩個工具是導入導出。

導入導出的參照物是hadoop,向hadoop導數據就是導入。

二、sqoop的版本?

sqoop目前有兩個版本,1.4.X為sqoop1;1.99.X為sqoop2。兩個版本不兼容。

三、使用sqoop列出mysql下的所有數據庫

(my_python_env)[root@hadoop26 ~]# sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root --password 123456
information_schema
hive
mysql
test

四、Import工具的使用

4.1將mysql中的某張表導入到hdfs上,現在test下有一張person表

4.2執行sqoop語句

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 -table person

4.3在hdfs用戶的家目錄下,產生了一個person文件夾

(my_python_env)[root@hadoop26 ~]# hadoop fs -ls
Found 2 items
drwx------   - root supergroup          0 2016-07-03 23:00 .Trash
drwxr-xr-x   - root supergroup          0 2016-07-21 22:30 person
(my_python_env)[root@hadoop26 ~]# hadoop fs -ls person
Found 3 items
-rw-r--r--   1 root supergroup          0 2016-07-21 22:30 person/_SUCCESS
-rw-r--r--   1 root supergroup         17 2016-07-21 22:30 person/part-m-00000
-rw-r--r--   1 root supergroup         12 2016-07-21 22:30 person/part-m-00001
(my_python_env)[root@hadoop26 ~]# hadoop fs -cat person/part-*
1,zhangsan,false
2,lisi,true

4.4delete-target-dir參數

當再次執行sqoop語句的時候,會報錯,因為person文件夾已經存在了,我們需要先刪除這個文件夾再運行sqoop語句。

也可以使用sqoop提供的delete-target-dir參數

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 -table person --delete-target-dir

4.5append參數

如果目標文件夾在hdfs上已經存在,那么再次運行就會報錯。可以使用--delete-target-dir來先刪除目錄。也可以使用append來往目錄下追加數據。append和delete-target-dir是相互沖突的。

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table person --append

執行完成后,查看hdfs上的文件

(my_python_env)[root@hadoop26 ~]# hadoop fs -ls person
Found 5 items
-rw-r--r--   1 root supergroup          0 2016-07-21 22:50 person/_SUCCESS
-rw-r--r--   1 root supergroup         17 2016-07-21 22:50 person/part-m-00000
-rw-r--r--   1 root supergroup         12 2016-07-21 22:50 person/part-m-00001
-rw-r--r--   1 root supergroup         17 2016-07-21 23:48 person/part-m-00002
-rw-r--r--   1 root supergroup         12 2016-07-21 23:48 person/part-m-00003

4.6target-dir參數

上述的所有操作都是吧mysql中的數據寫到一個默認的目錄下,可以使用target-dir來指定hdfs的目錄名

 sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table person --append --target-dir person-mysql

查看hdfs上的目錄

(my_python_env)[root@hadoop26 ~]# hadoop fs -ls 
Found 4 items
drwx------   - root supergroup          0 2016-07-03 23:00 .Trash
drwxr-xr-x   - root supergroup          0 2016-07-21 23:53 _sqoop
drwxr-xr-x   - root supergroup          0 2016-07-21 23:48 person
drwxr-xr-x   - root supergroup          0 2016-07-21 23:53 person-mysql

4.7map的個數

現在mysql表person中的數據增加到了11條

再次執行sqoop語句來導入

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --delete-target-dir --table person --target-dir person-mysql

查看hdfs上的目錄

(my_python_env)[root@hadoop26 ~]# hadoop fs -ls person-mysql
Found 5 items
-rw-r--r--   1 root supergroup          0 2016-07-21 23:59 person-mysql/_SUCCESS
-rw-r--r--   1 root supergroup         41 2016-07-21 23:59 person-mysql/part-m-00000
-rw-r--r--   1 root supergroup         35 2016-07-21 23:59 person-mysql/part-m-00001
-rw-r--r--   1 root supergroup         24 2016-07-21 23:59 person-mysql/part-m-00002
-rw-r--r--   1 root supergroup         37 2016-07-21 23:59 person-mysql/part-m-00003

從上面的結果可以發現,這個作業啟動了4個map任務,所以sqoop默認配置就是4個map,用戶也可以通過-m參數,自己指定map的數量

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --delete-target-dir --table person --target-dir person-mysql -m 1

查看hdfs上的目錄發現,這次只啟動了一個map任務

(my_python_env)[root@hadoop26 ~]# hadoop fs -ls person-mysql
Found 2 items
-rw-r--r--   1 root supergroup          0 2016-07-22 00:02 person-mysql/_SUCCESS
-rw-r--r--   1 root supergroup        137 2016-07-22 00:02 person-mysql/part-m-00000

4.8where參數

where參數可以進行一些簡單的篩選

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --delete-target-dir --table person --target-dir person-mysql -m 1 --where "gender=0"

(my_python_env)[root@hadoop26 ~]# hadoop fs -cat person-mysql/part*
1,zhangsan,false
3,003,false
4,004,false
6,006,false
7,007,false
8,008,false
9,009,false
11,011,false

4.9query參數

query參數就可以讓用戶隨意寫sql語句來查詢了。query和table參數是互斥的。

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --delete-target-dir --target-dir person-mysql -m 1 --query "select * from person where name='003' and gender=0 and \$CONDITIONS"

(my_python_env)[root@hadoop26 ~]# hadoop fs -cat person-mysql/part-*
3,003,false

4.10壓縮

如果想要使得導入到hdfs上的數據被壓縮,就可以使用-z或者--compression-codec來進行壓縮,-z壓縮方式是gzip壓縮,--compression-codec可以自定義壓縮方式

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --delete-target-dir --target-dir person-mysql -m 1 --table person -z

查看hdfs上的結果:

(my_python_env)[root@hadoop26 ~]# hadoop fs -ls person-mysql
Found 2 items
-rw-r--r--   1 root supergroup          0 2016-07-22 00:38 person-mysql/_SUCCESS
-rw-r--r--   1 root supergroup         99 2016-07-22 00:38 person-mysql/part-m-00000.gz

使用Snappy方式壓縮

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --delete-target-dir --target-dir person-mysql -m 1 --table person --compression-codec org.apache.hadoop.io.compress.SnappyCodec

4.11空值處理

像如圖id=12的記錄是沒有name和gender的,如果不加處理,導入到hdfs上是這樣子的:

(my_python_env)[root@hadoop26 ~]# hadoop fs -cat person-mysql/part*
1,zhangsan,false
2,lisi,true
3,003,false
4,004,false
5,005,true
6,006,false
7,007,false
8,008,false
9,009,false
10,010,true
11,011,false
12,null,null

sqoop提供了--null-string來處理字符類型的空值,提供了--null-non-string來處理非字符類型的空值。

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --delete-target-dir --target-dir person-mysql -m 1 --table person --null-string "" --null-non-string "false"

執行結果是:

(my_python_env)[root@hadoop26 ~]# hadoop fs -cat person-mysql/part*
1,zhangsan,false
2,lisi,true
3,003,false
4,004,false
5,005,true
6,006,false
7,007,false
8,008,false
9,009,false
10,010,true
11,011,false
12,,false

4.12增量傳輸

增量導入的一個場景就是昨天導入了一批數據,今天又增加了部分數據,現在要把這部分數據也導入到hdfs中。

sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456  --target-dir person-mysql -m 1 --table person --null-string "" --null-non-string "false" --check-column "id" --incremental append --last-value 5

執行結果是:

(my_python_env)[root@hadoop26 ~]# hadoop fs -cat person-mysql/part-m-00001
6,006,false
7,007,false
8,008,false
9,009,false
10,010,true
11,011,false
12,,false

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM