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