sqoop簡單操作-從mysql導入導出數據

一,將本地數據放入hive表中

1,本地數據

本地文件data1.txt中有兩列數據,如下:

1 aaa
2 bbb
3 ccc
4 ddd
5 eee
...

2,在hive中創建表

hive> create table table1                                  
    > (id int,name string)
    > ROW FORMAT DELIMITED
    > FIELDS TERMINATED BY ' '
    > STORED AS TEXTFILE;
OK
Time taken: 0.082 seconds

列與data1.txt中的數據對應,並給出數據分割的字符,在data1.txt中是空格符“ ” 所以FIELDS TERMINATED BY ' '

3,上傳文件中的數據到表table1中

hive> load data local inpath 'data1.txt' into table table1;
Copying data from file:/home/hadoop/test_data/data1.txt
Copying file: file:/home/hadoop/test_data/data1.txt
Loading data to table default.table1
Table default.table1 stats: [num_partitions: 0, num_files: 1, num_rows: 0, total_size: 131, raw_data_size: 0]
OK
Time taken: 0.326 seconds

注意:hive本身是不存儲數據的,簡單一點來說可以把它看做是mapreduce的一個包裝,讓使用者可以通過簡單的方式調用mapreduce來訪問hdfs中的數據。事實上它的數據本身還是放在hdfs上的。還記得之前在配置的時候設置了hive在hdfs中的warehouse嗎?那就是hive放數據的地方。那就看一下table1的數據位置吧:

hive> dfs -ls /user/hive/warehouse/table1
    > ;
Found 1 items
-rw-r--r--   1 hadoop supergroup        131 2014-10-20 09:06 /user/hive/warehouse/table1/data1.txt

可以看到實際上它只是把data1.txt放到了自己對應的hdfs的目錄下,table1的數據本事還是存儲在data1.txt這個文本文件中的。

查詢一下table1中的數據:

hive> select * from table1;
OK
1	aaa
2	bbb
3	ccc
4	ddd
5	eee
...
Time taken: 0.093 seconds, Fetched: 20 row(s)

data1.txt中的數據也就存在於表table1中了。

二,通過sqoop把hive中的表導出到mysql數據庫

1,在mysql中創建表用來存儲導入數據

mysql> use hive
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

選擇數據庫hive

mysql> create table import1 (id int,name varchar(10));
Query OK, 0 rows affected (0.07 sec)

創建表import1用來存儲數據

2,利用sqoop將hive中的表導出到mysql的表中

sqoop export -connect jdbc:mysql://localhost/hive -username hive -password mysql -table import1 -export-dir /user/hive/warehouse/table1 -input-fields-terminated-by ' '

實際上還是從hdfs中導出文件到mysql,所以還是要給出input-fields-terminated-by ' '

再查看mysql中的表import中的數據:

mysql> select * from import1
    -> ;
+------+------+
| id   | name |
+------+------+
|   17 | qqq  |
|   18 | rrr  |
|   19 | sss  |
|   20 | ttt  |
...
|   14 | nnn  |
|   15 | ooo  |
|   16 | ppp  |
+------+------+
20 rows in set (0.00 sec)
可以看到亂序了,這是因爲mapreduce的原因...

三,通過sqoop將mysql中的表導入到hive

sqoop import --connect jdbc:mysql://localhost/hive --username hive --password mysql --table import1 --split-by 'id'

這裏也要給出split-by參數,sqoop通過這裏的參數值來分配mapreduce任務。sqoop會將切分的不同區域的任務分配給不同的map中。每個map再從數據庫中一行一行的獲取值然後寫入到hdfs中。split-by根據不同的參數有不同的切分方法,例如int型,它會選取最大的值和最小的值根據傳入的-m參數(默認爲1)來確定劃分幾個區域。默認的split-by參數是要導入的表的主鍵,如果沒有給出參數又沒有主鍵,導入操作就會失敗報錯。

導入完成之後查看hive中的數據:

hive> select * from import1;
OK
1	aaa
2	bbb
3	ccc
...
19	sss
20	ttt
16	ppp
Time taken: 0.293 seconds, Fetched: 20 row(s)




發佈了47 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章