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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Sqoop操作

發(fā)布時(shí)間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Sqoop操作 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 前言
  • 一、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

[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:直接報(bào)錯(cuò)
–query后加上–where和–columns,且–columns指定的列與–query指定的列不相同時(shí)。同時(shí)這里過(guò)濾條件為–query后的where子句條件,而不是–where指定的過(guò)濾條件。

[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:可以通過(guò)并執(zhí)行。
–query后的where子句不加過(guò)濾條件,而是在–where后指定過(guò)濾條件。但是在執(zhí)行時(shí)–where指定的條件不會(huì)進(jìn)行過(guò)濾。而是直接將所有的數(shù)據(jù)進(jìn)行導(dǎo)入。

[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:直接報(bào)錯(cuò)
–query語(yǔ)句后不加where子句。而是通過(guò)–where進(jìn)行指定條件

[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:直接報(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ò)。

[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語(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é)論:

  • –query進(jìn)行自定義sql語(yǔ)句指定后,where子句后一定要加$CONDITIONS,否則報(bào)錯(cuò)。
  • –query不建議和–columns一起使用。因?yàn)槿绻咧付ǖ牧胁灰恢?#xff0c;那么就會(huì)報(bào)錯(cuò)。如果指定同樣的列那為什么還要再多寫個(gè)–columns呢
  • –query不建議和–where一起使用。因?yàn)閷懥栓Cwhere后,雖然系統(tǒng)不會(huì)報(bào)錯(cuò),可以執(zhí)行命令。但是系統(tǒng)根本不認(rèn)–where后指定的過(guò)濾條件,寫了也是白寫那為什么還要寫。
  • 當(dāng)m不等于1時(shí),必須使用–split-by指定拆分列。否則報(bào)錯(cuò)。
  • 使用–query來(lái)導(dǎo)入數(shù)據(jù)時(shí),必須指定–target-dir
  • 三、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é)

    以上是生活随笔為你收集整理的Sqoop操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。