日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Sqoop操作

發布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

[root@cq01 ~]# sqoop import --connect jdbc:mysql://cq03:3306/cq01 \> --username root \> --password 123456 \> --query 'select id,name from cq01 where id > 5' \> --target-dir hdfs://cq01:9820/sqoopdata/cq01 \> --delete-target-dir \> --split-by id \> -m 1

情形2:直接報錯
–query后加上–where和–columns,且–columns指定的列與–query指定的列不相同時。同時這里過濾條件為–query后的where子句條件,而不是–where指定的過濾條件。

[root@cq01 ~]# sqoop import --connect jdbc:mysql://cq03:3306/cq01 \> --username root \> --password 123456 \> --query 'select id,job from cq01 where id > 5 and $CONDITIONS' \> --columns 'id,name' \> --where 'id < 5' \> --target-dir hdfs://cq01:9820/sqoopdata/cq01 \> --delete-target-dir \> --split-by id \> -m 1

情形3:可以通過并執行。
–query后的where子句不加過濾條件,而是在–where后指定過濾條件。但是在執行時–where指定的條件不會進行過濾。而是直接將所有的數據進行導入。

[root@cq01 ~]# sqoop import --connect jdbc:mysql://cq03:3306/cq01 \> --username root \> --password 123456 \> --query 'select id,name from cq01 where $CONDITIONS' \> --columns 'id,name' \> --where 'id = 5' \> --target-dir hdfs://cq01:9820/sqoopdata/cq01 \> --delete-target-dir \> --split-by id \> -m 1

情形4:直接報錯
–query語句后不加where子句。而是通過–where進行指定條件

[root@cq01 ~]# sqoop import --connect jdbc:mysql://cq03:3306/cq01 \> --username root \> --password 123456 \> --query 'select id,name from cq01 $CONDITIONS' \> --columns 'id,name' \> --where 'id = 5' \> --target-dir hdfs://cq01:9820/sqoopdata/cq01 \> --delete-target-dir \> --split-by id \> -m 1

情形5:直接報錯
當沒有使用–split-by進行指定拆分列而且m不是0時。系統會報錯。但是當沒有使用–split-by時,但是指定了m=1,此時系統不會報錯。

[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

注意:

在–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解析就按照字面量來解析,所以不需要加反斜杠。

總結

結果上述幾種情形可以得出一下結論:

  • –query進行自定義sql語句指定后,where子句后一定要加$CONDITIONS,否則報錯。
  • –query不建議和–columns一起使用。因為如果二者指定的列不一致,那么就會報錯。如果指定同樣的列那為什么還要再多寫個–columns呢
  • –query不建議和–where一起使用。因為寫了–where后,雖然系統不會報錯,可以執行命令。但是系統根本不認–where后指定的過濾條件,寫了也是白寫那為什么還要寫。
  • 當m不等于1時,必須使用–split-by指定拆分列。否則報錯。
  • 使用–query來導入數據時,必須指定–target-dir
  • 三、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相關數據導入導出的命令操作了,有啥沒寫到的地方之后整理的時候再補上吧。

    總結

    以上是生活随笔為你收集整理的Sqoop操作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。