Sqoop操作
文章目錄
- 前言
- 一、Sqoop操作相關參數解釋
- 1.1 通用參數
- 1.2 import控制參數
- 1.3 導入到Hive命令參數
- 二、MySQL -> HDFS
- 三、HDFS 與 MySql之間數據傳輸示例
- 四、MySQL -> Hive
- 五、Hive -> MySql
- 總結
前言
sqoop-1.4.7的數據導入導出相關操作。
一、Sqoop操作相關參數解釋
1.1 通用參數
--connect
作用:指定JDBC連接字符串
--driver
作用:手動指定連接數據庫時的驅動名
--username
作用:指定訪問數據庫的用戶名
–password
作用:指定訪問數據庫的密碼
1.2 import控制參數
–append
作用:通過追加的方式導入到HDFS
–delete-target-dir
作用:如果目標文件夾存在,則刪除
–columns
作用:指定需要導入的列,可以指定多列,列與列之間用“,”進行隔開
–target-dir
作用:指定HDFS的目標文件夾,若路徑不存在時會自動創建
–split-by
作用:當表沒有主鍵列時,手動指定需要拆分的列。
–table
作用:指定需要導入到hdfs的mysql中的表名
–target-dir
作用:指定需要導入的hdfs目錄
–where
作用:作為query語句后的過濾條件
$CONDITIONS
作用:在query查詢語句中的where過濾條件中,必須包含$CONDITIONS,其本身是沒有實際意義的。
–fields-terminated-by
作用:指定導出文件的列與列之間的分隔符,默認分隔符為“,”
-e,–query
作用:指定查詢語句
注意:–query不建議和–where、–columns一起使用
-z,–compress
作用:是否要進行壓縮
-m
作用:指定用于執行導入的map任務的數量,默認為4。默認情況下,Sqoop會將表中的主鍵id列作為拆分列,然后再將其分成大小均勻的幾個部分。如果當一個表沒有主鍵時,那么默認m=4進行切分就會報錯,那么此時可以通過將m設置為1來避免報錯。m為1表示只使用一個Mapper進行運算,不進行數據切分。
切分后的每部分大小計算:(指定字段的最大值-最小值+1)/ m。
1.3 導入到Hive命令參數
–hive-home
作用:指定環境配置的$HIVE_HOME
–hive-import
作用:指定導入數據到Hive中
–hive-overwrite
作用:覆蓋當前已有的數據
–create-hive-table
作用:是否創建hive表,如果已經存在則會失敗。
–hive-table
作用:設置要導入的hive的表名
二、MySQL -> HDFS
數據準備
-- 在mysql建表CREATE TABLE cq01 ( id INT PRIMARY KEY, NAME VARCHAR ( 50 ), job VARCHAR ( 50 ), height INT );-- 插入數據INSERT INTO cq01 VALUES(1,'les','歌手',173);INSERT INTO cq01 VALUES(2,'hin','歌手',175);INSERT INTO cq01 VALUES(3,'eas','歌手',177);INSERT INTO cq01 VALUES(4,'xin','歌手',176);INSERT INTO cq01 VALUES(5,'hua','歌手',187);INSERT INTO cq01 VALUES(6,'zuo','歌手',167);INSERT INTO cq01 VALUES(7,'hong','歌手',177);INSERT INTO cq01 VALUES(8,'xu','導演',173);INSERT INTO cq01 VALUES(9,'teng','演員',167);INSERT INTO cq01 VALUES(10,'jj','歌手',197);將表導入HDFS
[root@cq01 ~]# sqoop import --connect jdbc:mysql://cq03:3306/cq01 \> --username root \> --password 123456 \> --table cq01 \> --target-dir hdfs://cq01:9820/sqoopdata/cq01 \> --delete-target-dir# 使用HDFS命令,快速查看結果[root@cq01 ~]# hdfs dfs -cat /sqoopdata/cq01/*注意:MySQL表沒有指定主鍵的時候需要使用–split-by來手動指定要分片的列。否則系統報錯。
將指定列導入
# 使用--columns進行指定[root@cq01 ~]# sqoop import --connect jdbc:mysql://cq03/cq01 \> --username root \> --password 123456 \> --table cq01 \> --columns 'id,name' \> --target-dir hdfs://cq01:9820/sqoopdata/cq01 \> --delete-target-dir# 使用hdfs命令進行快速查看[root@cq01 ~]# hdfs dfs -cat /sqoopdata/cq01/*指定條件導入
# 使用--where進行條件過濾[root@cq01 ~]# sqoop import --connect jdbc:mysql://cq03:3306/cq01 \> --username root \> --password 123456 \> --table cq01 \> --columns 'id,name' \> --where 'id < 5' \> --target-dir hdfs://cq01:9820/sqoopdata/cq01 \> --delete-target-dir# 使用hdfs命令進行快速查看[root@cq01 ~]# hdfs dfs -cat /sqoopdata/cq01/*指定sql語句導入
# 使用--query進行指定自定義sql語句[root@cq01 ~]# sqoop import --connect jdbc:mysql://cq03:3306/cq01 \> --username root \> --password 123456 \> --query 'select id,name from cq01 where id > 5 and $CONDITIONS' \> --target-dir hdfs://cq01:9820/sqoopdata/cq01 \> --delete-target-dir \> --split-by id \> -m 1# 使用hdfs命令進行快速查看[root@cq01 ~]# hdfs dfs -cat /sqoopdata/cq01/* > 注意:此處--query必須加上$CONDITIONS。否則報錯。不建議和--where、--columns一起使用,可能會出現報錯。幾種命令情形以及運行結果
情形1:直接報錯。
–query語句后不跟$CONDITIONS
情形2:直接報錯
–query后加上–where和–columns,且–columns指定的列與–query指定的列不相同時。同時這里過濾條件為–query后的where子句條件,而不是–where指定的過濾條件。
情形3:可以通過并執行。
–query后的where子句不加過濾條件,而是在–where后指定過濾條件。但是在執行時–where指定的條件不會進行過濾。而是直接將所有的數據進行導入。
情形4:直接報錯
–query語句后不加where子句。而是通過–where進行指定條件
情形5:直接報錯
當沒有使用–split-by進行指定拆分列而且m不是0時。系統會報錯。但是當沒有使用–split-by時,但是指定了m=1,此時系統不會報錯。
注意:
在–query后指定sql語句時使用單引號和雙引號是有區別的。
單引號:
--query 'select id,name from cq01 where id > 5 and $CONDITIONS'雙引號:
--query "select id,name from cq01 where id > 5 and \$CONDITIONS"單引號在$CONDITIONS前不用加反斜杠,而雙引號在$CONDITIONS前需要加反斜杠。這是因為使用雙引號后,sqoop會在解析的時候進行轉義的解析,所以必須加上轉義字符反斜杠。而默認的字符引號就是單引號,所以在使用單引號的時候,sqoop解析就按照字面量來解析,所以不需要加反斜杠。
總結
結果上述幾種情形可以得出一下結論:
三、HDFS 與 MySql之間數據傳輸示例
整表導入、導出
# 用于數據存放的表需要在MySQL中提前創建CREATE TABLE cq02 like cq01;# 創建臨時數據表,并添加數據CREATE TABLE tmp_cq02 like cq01;# 導入到HDFS上[root@cq01 ~]# sqoop import --connect jdbc:mysql://cq03:3306/cq01 \> --username root \> --password 123456 \> --table tmp_cq02 \> --driver com.mysql.cj.jdbc.Driver \> --target-dir /sqoop01/tmp_cq02 \> --fields-terminated-by '\t' \> --null-string '\\N' \> --null-non-string '0';sqoop import --connect jdbc:mysql://cq03:3306/cq01 \--username root \--password 123456 \--table tmp_cq02 \--driver com.mysql.cj.jdbc.Driver \--target-dir /sqoop01/tmp_cq02 \--fields-terminated-by '\t' \--null-string '\\N' \--null-non-string '0';# 導出到MySQL表中[root@cq01 ~]# sqoop export --connect jdbc:mysql://cq03:3306/cq01 \> --username root \> --password 123456 \> --table cq02 \> --driver com.mysql.cj.jdbc.Driver \> --export-dir '/sqoop01/tmp_cq02/*' \> --input-fields-terminated-by '\t' \> --input-null-string '\\N' \> --input-null-non-string '0' \> -m 1;sqoop export --connect jdbc:mysql://cq03:3306/cq01 \--username root \--password 123456 \--table cq02 \--driver com.mysql.cj.jdbc.Driver \--export-dir '/sqoop01/tmp_cq02/*' \--input-fields-terminated-by '\t' \--input-null-string '\\N' \--input-null-non-string '0' \-m 1;# 查詢效果select * from cq02;部分數據導入、導出
# 將數據部分導入到HDFS[root@cq01 ~]# sqoop import --connect jdbc:mysql://cq03:3306/cq01 \> --username root \> --password 123456 \> --query 'select id,name from cq02 where id < 3 and $CONDITIONS' \> --driver com.mysql.cj.jdbc.Driver \> --delete-target-dir \> --target-dir '/sqoop01/tmp_cq03' \> --split-by id \> -m 1 \> --fields-terminated-by '\t' \> --null-string '\\N' \> --null-non-string '0';# 查看HDFS上的數據[root@cq01 ~]# hdfs dfs -cat /sqoop01/tmp_cq03/*;# 先在MySQL中創建需要存放數據的表cq03mysql> create table cq03 like cq02;# 將HDFS上的數據導出到MySQL[root@cq01 ~]# sqoop export --connect jdbc:mysql://cq03:3306/cq01 \> --username root \> --password 123456 \> --table cq03 \> --driver com.mysql.jdbc.Driver \> --export-dir '/sqoop01/tmp_cq03/*' \> --input-fields-terminated-by '\t' \> --input-null-string '\\N' \> --input-null-non-string '\\N' \> -m 1# 查看數據mysql> select * from cq03;總結
- 最好使用–input-fields-terminated-by進行分隔符指定
- –export-dir是一個hdfs中的目錄,不識別_SUCCESS文件
- 使用–query時,要注意其他參數的設置
- 導出數據中有些列值有“null”,會報無法解析,需要使用相關參數進行設置
- 導出數據的類型要和MySQL中定義的類型一致。
四、MySQL -> Hive
# 導入到Hive中示例[root@cq01 ~]# sqoop import --connect jdbc:mysql://cq03:3306/cq01 \> --username root \> --password 123456 \> --table cq01 \> --hive-import \> --hive-overwrite \> --hive-table "cq15" \> --hive-database cq01 \> -m 1#在Hive中查看數據是否導入hive (cq01)> show tables;hive (cq01)> select * from cq15;五、Hive -> MySql
因為Hive的數據是存在HDFS上的,所以Hive導出到MySQL實質上和HDFS導出到MySQL是一樣的。這里就不在演示,可以參考上面HDFS導出示例。
總結
以上就是Sqoop相關數據導入導出的命令操作了,有啥沒寫到的地方之后整理的時候再補上吧。
總結
- 上一篇: leetcode算法121.买卖股票的最
- 下一篇: 金融术语学习【持续更新】