1. 程式人生 > >sqoop的常用命令

sqoop的常用命令

判斷 語法 war app fields hive and pre def

1. 基礎命令

列出MySQL中有那些數據庫

sqoop list-databases \  
--connect jdbc:mysql://hadoop01:3306/ --username hadoop --password root \

列出MySQL中的數據庫有哪些表

sqoop list-tables \  
--connect jdbc:mysql://hadoop01:3306/mysql \ 
--username hadoop \ 
--password root \

在hive中創建一個跟MySQL數據庫表中一樣的表

create-hive-table  
--connect jdbc:mysql://hadoop01:3306/test 
--username hadoop 
--password root 
--table book 
--hive-table test_hk

2.sqoop的數據導入

語法:sqoop import (generic-args) (import-args)
常用參數

-connect jdbc 連接地址 
--connection-manager 連接管理者 
--driver 驅動類 
--hadoop-mapred-home $HADOOP_MAPRED_HOME 
--help help 信息 
-P 從命令行輸入密碼 
-m  指定maptask的個數,指定maptask的並行度
--target-dir  指定導出數據在hdfs上的存儲目錄
--fields-terminated-by  指定每條記錄中字段之間的分隔符
--where 指定查詢sql的where條件
--query  指定sql查詢
--columns 指定查詢的列  (不指定默認導出所有的列)
--password 密碼
 --username 賬號
 --verbose 打印流程信息
 --connection-param-file 可選參數

MySQL ---> HDFS

#不指定分隔符和路徑
sqoop import --connect jdbc:mysql://hadoop01:3306/test \  #指定連接
--username hadoop \   #指定MySQL的用戶名
-password root \     #指定MySQL的密碼
--table book \        #指定導出的MySQL的表
-m 1             #啟動一個maptask
#ps:如果沒有指定文件的存儲目錄,那麽默認的會保存在hdfs上的/user/用戶/book 目錄中,默認的字段的分隔符逗號。

#指定導入路徑和分割符
sqoop import --connect jdbc:mysql://hadoop01:3306/test --username hadoop --password root --table book --target-dir /user/hadoop/book --fields-terminated-by ‘\t‘ -m 1

#導入where的結果
sqoop import --connect jdbc:mysql://hadoop01:3306/test --username hadoop --password root --where "bid>2" --table book --target-dir /user/hadoop/book1 -m 1
ps:where後的條件,用雙引號,如果條件的字段為string則裏面使用單引號

#導入query結果數據
sqoop import --connect jdbc:mysql://hadoop01:3306/test --username hadoop --password root --target-dir /user/hadoop/book3 --query ‘select * from book where 1=1 and $CONDITIONS‘ --split-by bid \   #指定maptask切分的列,列的值.hashcode/maptask的個數
--fields-terminated-by ‘\t‘ -m 1
ps:
1.query外層使用單引號,SQL 語句當中的條件使用雙引號,否則會報錯;
2.在使用query時,必須有where子句,並且必須加入 and $CONDITIONS ,否則會報錯
3.--query不能和--where、--columns一起使用的
4.--query sql語句,放入雙引號中需要加轉義

MySQL ---> hive
?Sqoop導入關系型數據到hive,的過程是先導入hdfs中,然後在load到hive。

#普通導入
sqoop import --connect jdbc:mysql://hadoop01:3306/test --username hadoop --password root --table book --hive-import -m 1
ps:導入數據到hive表中時,默認在default庫下,表名和MySQL導入的表名一樣。,默認采用‘\u0001‘分隔。

#全量集
sqoop import --connect jdbc:mysql://hadoop01:3306/test --username hadoop --password root --table book --fields-terminated-by ‘\t‘ \   #列分割符
--lines-terminated-by ‘\n‘  \   #行分隔符 ,默認也是\n
--hive-import --hive-overwrite \  #覆蓋導入
--create-hive-table \ #創建表(默認也會自動創建表)
--hive-table test.book \  #hive的表名
--delete-target-dir  #刪除中間存放的臨時目錄
ps:表會自動創建,但是庫不會,所以在執行語句前,一定要保證hive的數據庫存在,否則會把報錯。

#增量導入,增量數據導入僅導入新添加的行
#它需要添加 ‘incremental‘ , ‘check-column‘, 和 ‘last-value‘ 選項來執行增量導入
sqoop import --connect jdbc:mysql://hadoop01:3306/test --username hadoop --password root --table book --target-dir /user/hadoop/book --incremental append \ #指定是增量導入 
--check-column bid  \  #指定增量的列
--last-value 500 \  #指定上一次的結束的列的值,(是從>500開始)一直到末尾
-m 1
ps:
1.--incremental有兩個值,append必須指定增量的列,指定使用--check-column(一般是MySQL的主鍵);lastmodified,最後一次修改表的時間
2.增量備份如果想要導入hive中,只能指定--target-dir,導入到存放表的目錄下,默認的hive不支持增量導入(即不能添加--hive-import)

MySQL ---> hbase

#sqoop import --connect jdbc:mysql://hadoop02:3306/mysql --username root --password root --table help_keyword --hbase-table new_help_keyword --column-family person --hbase-row-key help_keyword_id

#字段解釋
--connect jdbc:mysql://hadoop04:3306/mysql 表示遠程或者本地 Mysql 服務的 URI
--hbase-create-table 表示在 HBase 中建立表。
--hbase-table new_help_keyword 表示在 HBase 中建立表 new_help_keyword。
--hbase-row-key help_keyword_id 表示hbase表的rowkey是mysql表的help_keyword_id
字段。
--column-family person 表示在表 new_help_keyword 中建立列族 person。
--username ‘root‘ 表示使用用戶 root 連接 mysql。
--password ‘root‘ 連接 mysql 的用戶密碼
--table help_keyword 表示導出 mysql 數據庫的 help_keyword 表。

3.sqoop的數據導出

語法:sqoop export (generic-args) (export-args)
常用參數

--direct 快速導入
--export-dir HDFS 導出數據的目錄 
-m,--num-mappers 都少個 map 線程 
--table 導出哪個表 
--call 存儲過程
--update-key 通過哪個字段來判斷更新 
--update-mode 插入模式,默認是只更新,可以設置為 allowinsert.
--input-null-string 字符類型 null 處理 
--input-null-non-string 非字符類型 null 處理
--staging-table 臨時表
--clear-staging-table 清空臨時表
--batch 批量模式

HDFS ---> MySQL

sqoop export --connect jdbc:mysql://hadoop01:3306/test --username hadoop --password root --table book --export-dir /sqoopdata --fields-terminated-by ‘,‘

hive----> MySQL

sqoop export --connect jdbc:mysql://hadoop01:3306/test --username hadoop --password root --table book --export-dir /user/hive/warehouse/uv/dt=2011-08-03 --input-fileds-terminated-by ‘\t‘

hbase---->MySQL
默認的沒有命令直接將hbase中的數據導入到MySQL,因為在hbase中的表數據量通常比較大,如果一次性導入到MySQL,可能導致MySQL直接崩潰。
但是可以用別的辦法進行導入:

  1. 將 Hbase 數據,扁平化成 HDFS 文件,然後再由 sqoop 導入
  2. 將 Hbase 數據導入 Hive 表中,然後再導入 mysql
  3. 直接使用 Hbase 的 Java API 讀取表數據,直接向 mysql 導入,不需要使用 sqoop

sqoop的常用命令