sqoop 常用命令


 

sqoop 常用命令

一、Sqoop與MySQL

1.列出mysql數據庫中的所有數據庫

sqoop list-databases -connect jdbc:mysql://192.168.1.10:3306 -username root -password root

注意:

以下URL寫法,都可以

jdbc:mysql://192.168.1.10:3306/(推薦)

jdbc:mysql://192.168.1.10/

jdbc:mysql://192.168.1.10

jdbc:mysql://masters:3306/

jdbc:mysql://master/

jdbc:mysql://master

jdbc:mysql://localhost:3306/

jdbc:mysql://localhost/

jdbc:mysql:///

jdbc:mysql://

 

2.列出數據庫sqoop中的所有數據表

sqoop list-tables -connect jdbc:mysql:///sqoop -username root -password root

 

3.通過Sqoop執行SQL語句

sqoop eval -connect jdbc:mysql:///sqoop -username root -password root -query "select * from employee where id=5"

可以快速地使用SQL語句對關系數據庫進行操作,這可以使得在使用import這種工具進行數據導入的時候,可以預先了解相關的SQL語句是否正確,並能將結果顯示在控制台。

 

二、Sqoop與HDFS

1.將sqoop.employee表中的數據導入HDFS的/sqfs目錄下

sqoop import -connect jdbc:mysql://192.168.10.71:3306/t2 -username=root -password=root -table employee -m 1 -target-dir /output/1

mysql只認ip地址

疊加

  • 追加模式

sqoop import -connect jdbc:mysql://192.168.10.71:3306/t2 -username root -password root -table employee -m 1 -target-dir /output/3 -incremental append -check-column id -last-value "5"

  • 最后修改模式

sqoop import -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -password root -table employee -m 1 -target-dir /sqfs -incremental lastmodified -check-column lastmodified  -last-value '2016/1/5 18:00:05'

 

SQL語句

sqoop import -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -password root -m 1 -query 'SELECT id,birthday from employee where $CONDITIONS' -target-dir /res

注:不能添加-table參數

 

sqoop import-all-tables -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -paseeword root -m 1

注:不能添加-target-dir參數

導出的默認路徑是:/user/用戶名/若干數據表名/數據文件和_SUCCESS

所有表都有主鍵時,可以設置-m的參數大於1,否則只能唯 1

 

2.將HDFS上/sqfs目錄下的數據導入的sqoop.employee表中

sqoop export -connect "jdbc:mysql://192.168.11.51:3306/big1806?useUnicode=true&characterEncoding=utf-8" -username root -password root -table t2 -m 1 -export-dir /sqoop/mysql/t1

采用export插入數據的時候,如果數據已經存在了,插入會失敗如果我們使用-update-key,它會認為每個數據都是更新,比如我們使用下面這條語句

sqoop export -table foo -update-key id -export-dir /path/to/data -connect …

UPDATE foo SET msg='this is a test', bar=42 WHERE id=0;

UPDATE foo SET msg='some more data', bar=100 WHERE id=1;

...

這樣即使找不到它也不會報錯

-update-mode allowinsert 如果存在就更新,不存在就插入

 

三、Sqoop與Hive

1.將關系型數據的employee表結構復制到Hive

sqoop create-hive-table -connect jdbc:mysql://192.168.11.51:3306/big1806 -username root -password root -table t1 -hive-table sqoop.t1 -fields-terminated-by "\0001" -lines-terminated-by "\n"注:

-hive-table emp指定在Hive中創建的表名為emp(默認數據庫default

-hive-table sqoop.emp指定在Hive中的sqoop數據庫下創建emp

-fields-terminated-by "\0001"  是設置每列之間的分隔符,"\0001"ASCII碼中的1,是hive的默認行內分隔符,而sqoop的默認行內分隔符為"

-lines-terminated-by "\n"  設置的是每行之間的分隔符,此處為換行符,也是默認的分隔符;

2.將關系數據庫中的employee表的數據導入文件到Hive表中

sqoop import -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -password root -table employee -hive-table sqoop.emp -m 1 -fields-terminated-by "\0001" -hive-import

注:

-fields-terminated-by "\0001" 需同創建Hive表時保持一致

-hive-import 指定是Hive導入數據

-split-by id employee中沒有主鍵時,用於指定Mapper時的Key

 

追加1

sqoop import -append -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -password root -target-dir /user/hive/warehouse/sqoop.db/emp/ -fields-terminated-by "\0001" -query "select * from employee where \$CONDITIONS" -m 1

注:

可以添加-columns-where參數,同時使用時-where參數會失效

 

追加2

sqoop import -append -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -password root -table employee -columns "id,name,birthday" -where "id=2" -m 1 -target-dir /user/hive/warehouse/sqoop.db/emp/ -fields-terminated-by "\0001"

注:

-target-dir /user/hive/warehouse/sqoop.db/emp 可用-hive-table sqoop.emp -hive-import替換,但是要去掉 -append 參數。

 

在導入大對象,比如BLOBCLOB列時需要特殊處理,小於16MB的大對象可以和別的數據一起存儲,超過這個值就存儲在_lobs的子目錄當中它們采用的是為大對象做過優化的存儲格式,最大能存儲2^63字節的數據,我們可以用-inline-lob-limit參數來指定每個lob文件最大的限制是多少如果設置為0,則大對象使用外部存儲

 

3. Hive導入參數

-hive-home <dir> 重寫$HIVE_HOME

-hive-import 插入數據到hive當中,使用hive的默認分隔符

-hive-overwrite 重寫插入

-create-hive-table 建表,如果表已經存在,該操作會報錯!

-hive-table <table-name> 設置到hive當中的表名

-hive-drop-import-delims 導入到hive時刪除 \n, \r, and \0001 

-hive-delims-replacement 導入到hive時用自定義的字符替換掉 \n, \r, and \0001 

-hive-partition-key hive分區的key

-hive-partition-value <v> hive分區的值

-map-column-hive <map> 類型匹配,sql類型對應到hive類型

hive空值處理

sqoop會自動把NULL轉換為null處理,但是hive中默認是把\N來表示null,因為預先處理不會生效的我們需要使用 -null-string -null-non-string來處理空值 把\N轉為\\N

例句:sqoop import  ... -null-string '\\N' -null-non-string '\\N'

sqoop導入hive數據到MySql碰到hive表中列的值為null的情況:

在導入數據的過程中,如果碰到列值為null的情況,hive中為null的是以\N代替的,所以你在導入到MySql時,需要加上兩個參數:--input-null-string '\\N' --input-null-non-string '\\N',多加一個'\',是為轉義。如果你通過這個還不能解決字段為null的情況,還是報什么NumberFormalt異常的話,那就是比較另類的了,沒有關系,我們還是要辦法解決。

你應該注意到每次通過sqoop導入MySql的時,都會生成一個以MySql表命名的.java文件,然后打成JAR包,給sqoop提交給hadoop MR來解析Hive表中的數據。那我們可以根據報的錯誤,找到對應的行,改寫該文件,編譯,重新打包,sqoop可以通過 -jar-file --class-name 組合讓我們指定運行自己的jar包中的某個class。來解析該hive表中的每行數據。腳本如下:一個完整的例子如下:

sqoop export --connect "jdbc:mysql://localhost/aaa?useUnicode=true&characterEncoding=utf-8"

--username aaa --password bbb --table table

--export-dir /hive/warehouse/table --input-fields-terminated-by '\t'

--input-null-string '\\N' --input-null-non-string '\\N'

--class-name com.chamago.sqoop.codegen.bi_weekly_sales_item

--jar-file /tmp/sqoop-chamago/bi_weekly_sales_item.jar

上面--jar-file 參數指定jar包的路徑。--class-name 指定jar包中的class
這樣就可以解決所有解析異常了。

 

4.將Hive中的表數據導入到mysql數據庫employee表中

sqoop export -connect "jdbc:mysql://192.168.11.51:3306/big1806?useUnicode=true&characterEncoding=utf-8" -username root -password root -table t3 -export-dir /user/hive/warehouse/sqoop.db/t1/ part-m-00000 -input-fields-terminated-by '\0001'注:

在進行導入之前,mysqlsqoop數據庫中employee表必須已經提起創建好了。

jdbc:mysql://192.168.1.10:3306/sqoop中的IP地址改成localhost會報異常

指定/user/hive/warehouse/sqoop.db/emp/part-m-00000,只加載該文件

指定/user/hive/warehouse/sqoop.db/emp/,加載該目錄下的所有文件

 

四、Sqoop與HBase

 

1. MySQL 中的employee表中的數據導入數據到 HBaseemp表中

sqoop import -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -password root -table employee -hbase-table emp -column-family 'per data' -hbase-row-key id -m 1

注:

-hbase-table emp 指定HBase的表emp

-column-family 'per data' 指定列族名per data

-hbase-create-table 該參數是用來創建HBase表的,但不太管用

 

2. 將employee表不同列的數據添加到emp表中不同列族中

  • 先將employee表的name列中的數據到per data列族中

sqoop import -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -password root -table employee -hbase-table emp -column-family 'per data' -hbase-row-key id -m 1 -columns id,name

注:

-columns id,name 指定employee表中的idname

-hbase-row-key id 指定emp表中的行id

  • 先將employee表的agebirthday列中的數據到pro data列族中

sqoop import -connect jdbc:mysql://192.168.1.10:3306/sqoop -username root -password root -table employee -hbase-table emp -column-family 'per data' -hbase-row-key id -m 1 -columns id,age,birthday

 

五、重要參數

1.轉換為對象

-map-column-java <mapping>  將轉換為java數據類型

-map-column-hive <mapping>  將hive數據類型

2.分隔符、轉字符

例句:

Some string, with a comma.

Another "string with quotes"

導入命令

$ sqoop import -fields-terminated-by , -escaped-by \\ -enclosed-by '\"' ...

處理結果

"Some string, with a comma.","1","2","3"...

"Another \"string with quotes\"","4","5","6"...

導入命令

$ sqoop import -optionally-enclosed-by '\"' (the rest as above)...

處理結果:

"Some string, with a comma.",1,2,3...

"Another \"string with quotes\"",4,5,6...

 

六、常用工具

1. sqoop job

保存常用的作業,以便下次快速調用

-create <job-id> 創建一個新的job
  -delete <job-id> 刪除job
  -exec <job-id>  執行job
  -show <job-id> 顯示job的參數
  -list 列出所有的job

 

  • 創建job

sqoop job -create myjob - import -connect jdbc:mysql://example.com/db ... -table mytable

  • 列出所有job

sqoop job -list

  • 查看job

sqoop job -show myjob

  • 執行job

sqoop job -exec myjob

  • 重寫參數

sqoop job -exec myjob -username someuser -P

 

2. 聚合工具

sqoop-metastore、sqoop-merge
合並兩個目錄

sqoop merge -new-data newer -onto older -target-dir merged -jar-file datatypes.jar -class-name Foo -merge-key id

 

3. 校驗Validate

它用來比較源數據和目標數據的數量

sqoop import --connect jdbc:mysql://db.foo.com/corp ... -table EMPLOYEES --validate

sqoop export --connect jdbc:mysql://db.example.com/foo --table bar -export-dir /results/bar_data --validate

注:

它有三個接口

Validator

Property:         validator

Description:      Driver for validation,

                  must implement org.apache.sqoop.validation.Validator

Supported values: The value has to be a fully qualified class name.

Default value:    org.apache.sqoop.validation.RowCountValidator

 

Validation Threshold

Property: validation-threshold

Description: Drives the decision based on the validation meeting the

threshold or not. Must implement

org.apache.sqoop.validation.ValidationThreshold

Supported values: The value has to be a fully qualified class name.

Default value: org.apache.sqoop.validation.AbsoluteValidationThreshold

 

Validation Failure Handler

Property: validation-failurehandler

Description: Responsible for handling failures, must implement

org.apache.sqoop.validation.ValidationFailureHandler

Supported values: The value has to be a fully qualified class name.

Default value: org.apache.sqoop.validation.LogOnFailureHandler

 

 

例句:

sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES 

添加參數:

-validate -validator org.apache.sqoop.validation.RowCountValidator

或-validate -validation-threshold

-validate -validation-failurehandler

 

 

七、配置文件

通過配置文件conf/sqoop-site.xml來配置常用參數

例:

<property>

<name>property.name</name>

<value>property.value</value>

</property>

如果不在這里面配置的話,就需要像這樣寫命令

sqoop import -D property.name=property.value ...

 

參數:sqoop.bigdecimal.format.string

作用:decimal是否保存為string,如果保存為string就是 0.0000007,否則為1E7
  

參數:sqoop.hbase.add.row.key

作用:是否把作為rowkey的列也加到行數據當中,默認是false

 

 

 

附件:

1. 亂碼問題:

MySQLHDFS相互導入,導出的亂碼問題。

修改MySQL的編碼格式,由Latin1改為UTF-8

 vi /etc/my.cnf

添加如下內容:紅色的這個 適合老版mysql 入mysql5.1.71

[mysqld]

default-character-set=utf8

character_set_server=utf8

init_connect='SET NAMES utf8' 

 

[mysql]

default-character-set=utf8

 

[client]

default-character-set=utf8

 

重啟MySQL服務,重建庫、表;

 

2. MySQL建表語句

創建員工表1

create table employee(

id int primary key auto_increment,

name varchar(20),

birthday date

);

測試數據:

insert into employee values('','張三','2000-01-01');

insert into employee values('','李四','2001-01-01');

insert into employee values('','王五','2002-01-01');

insert into employee values('','張小三','2003-01-01');

insert into employee values('','李小四','2004-01-01');

insert into employee values('','王小五','2005-01-01');

insert into employee values('','張大三','2006-01-01');

insert into employee values('','李大四','2007-01-01');

insert into employee values('','王大五','2008-01-01');

insert into employee values('','王二麻子','2009-01-01');

insert into employee values('','wangermazi','2010-01-01');

 

創建員工表2

create table em(

id int,

name varchar(20),

birthday date

);

測試數據:

insert into employee values('0','張三','2000-01-01');

insert into employee values('1','李四','2001-01-01');

insert into employee values('2','王五','2002-01-01');

insert into employee values('3','張小三','2003-01-01');

insert into employee values('4','李小四','2004-01-01');

insert into employee values('5','王小五','2005-01-01');

insert into employee values('6','張大三','2006-01-01');

insert into employee values('7','李大四','2007-01-01');

insert into employee values('8','王大五','2008-01-01');

insert into employee values('9','王二麻子','2009-01-01');

insert into employee values('10','wangermazi','2009-01-01');

 

3. HBase建表語句

MySQL建表語句

create table employee(

id int,

name varchar(20),

age int,

birthday date

);

測試數據

insert into employee values('0','張三','18','2003-01-01');

insert into employee values('1','李四','18','2003-01-01');

insert into employee values('2','王五','18','2003-01-01');

insert into employee values('3','wangermazi','18','2003-01-01');

 

創表語句

create 'emp','per data','pro data'

刪表語句

disable 'emp'

drop 'emp'

查詢語句

scan ‘emp’

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM