sqoop一些語法的使用


 

參數詳細資料 觀看這個博客

http://shiyanjun.cn/archives/624.html

Sqoop可以在HDFS/Hive和關系型數據庫之間進行數據的導入導出,其中主要使用了import和export這兩個工具。這兩個工具非常強大,提供了很多選項幫助我們完成數據的遷移和同步。比如,下面兩個潛在的需求:

  1. 業務數據存放在關系數據庫中,如果數據量達到一定規模后需要對其進行分析或同統計,單純使用關系數據庫可能會成為瓶頸,這時可以將數據從業務數據庫數據導入(import)到Hadoop平台進行離線分析。
  2. 對大規模的數據在Hadoop平台上進行分析以后,可能需要將結果同步到關系數據庫中作為業務的輔助數據,這時候需要將Hadoop平台分析后的數據導出(export)到關系數據庫。

這里,我們介紹Sqoop完成上述基本應用場景所使用的import和export工具,通過一些簡單的例子來說明這兩個工具是如何做到的。

import和export工具有些通用的選項,如下表所示:

選項 含義說明
--connect <jdbc-uri> 指定JDBC連接字符串
--connection-manager <class-name> 指定要使用的連接管理器類
--driver <class-name> 指定要使用的JDBC驅動類
--hadoop-mapred-home <dir> 指定$HADOOP_MAPRED_HOME路徑
--help 打印用法幫助信息
--password-file 設置用於存放認證的密碼信息文件的路徑
-P 從控制台讀取輸入的密碼
--password <password> 設置認證密碼
--username <username> 設置認證用戶名
--verbose 打印詳細的運行信息
--connection-param-file <filename> 可選,指定存儲數據庫連接參數的屬性文件

 

數據導入工具import

import工具,是將HDFS平台外部的結構化存儲系統中的數據導入到Hadoop平台,便於后續分析。我們先看一下import工具的基本選項及其含義,如下表所示:

選項 含義說明
--append 將數據追加到HDFS上一個已存在的數據集上
--as-avrodatafile 將數據導入到Avro數據文件
--as-sequencefile 將數據導入到SequenceFile
--as-textfile 將數據導入到普通文本文件(默認)
--boundary-query <statement> 邊界查詢,用於創建分片(InputSplit)
--columns <col,col,col…> 從表中導出指定的一組列的數據
--delete-target-dir 如果指定目錄存在,則先刪除掉
--direct 使用直接導入模式(優化導入速度)
--direct-split-size <n> 分割輸入stream的字節大小(在直接導入模式下)
--fetch-size <n> 從數據庫中批量讀取記錄數
--inline-lob-limit <n> 設置內聯的LOB對象的大小
-m,--num-mappers <n> 使用n個map任務並行導入數據
-e,--query <statement> 導入的查詢語句
--split-by <column-name> 指定按照哪個列去分割數據
--table <table-name> 導入的源表表名
--target-dir <dir> 導入HDFS的目標路徑
--warehouse-dir <dir> HDFS存放表的根路徑
--where <where clause> 指定導出時所使用的查詢條件
-z,--compress 啟用壓縮
--compression-codec <c> 指定Hadoop的codec方式(默認gzip)
--null-string <null-string> 果指定列為字符串類型,使用指定字符串替換值為null的該類列的值
--null-non-string <null-string> 如果指定列為非字符串類型,使用指定字符串替換值為null的該類列的值

 

bin/sqoop help 可以查看出幫助文檔 英文的 看不懂 

 

1:sqoop查看mysql有多少個數據庫

bin/sqoop list-databases \
--connect jdbc:mysql://172.16.71.27:3306 \
--username root \
--password root

 

                  

 

2:將mysql表中數據導入到hdfs中 imports

bin/sqoop import \
--connect jdbc:mysql://172.16.71.27:3306/babasport \
--username root \
--password root \
--table test_tb

ps:如果沒有指定hdfs的目錄 默認會將數據存到系統當前登錄用戶下 以表名稱命名的文件夾下

ps : 復制的時候一定要注意下 \ 的位置 少個空格都會報錯。。。   默認會有4個MapReduce在執行 這里測試數據只有2條 so。。。

 

  數據默認以逗號隔開 可以根據需求進行指定

 

導入數據至指定hdfs目錄

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \
--username root \
--password 123456 \
--table my_user \
--target-dir /user/beifeng/sqoop/imp_my_user \
--num-mappers 1

ps:   num-mappers 1     指定執行MapReduce的個數為1

          target-dir  指定hdfs的目錄

 

sqoop 底層的實現就是MapReduce,import來說,僅僅運行Map Task

數據存儲文件
* textfile
* orcfile
* parquet

 

 

將數據按照parquet文件格式導出到hdfs指定目錄

bin/sqoop import \
--connect jdbc:mysql://172.16.71.27:3306/babasport \
--username root \
--password root \
--table test_tb \
--target-dir /user/xuyou/sqoop/imp_my_user_parquet \
--fields-terminated-by '@' \
--num-mappers 1 \
--as-parquetfile

ps     fields-terminated-by '@'      數據已@隔開   

   as-parquetfile      數據按照parquet文件格式存儲

        columns id,name   這個屬性 可以只導入id已經name 這兩個列的值

     

   

* 在實際的項目中,要處理的數據,需要進行初步清洗和過濾
* 某些字段過濾
* 條件
* join

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \
--username root \
--password 123456 \
--query 'select id, account from my_user where $CONDITIONS' \
--target-dir /user/beifeng/sqoop/imp_my_user_query \
--num-mappers 1

ps:   query 這個屬性代替了 table 可以通過用sql 語句來導出數據
(where $CONDITIONS' 是固定寫法 如果需要條件查詢可以  select id, account from my_user where $CONDITIONS' and id > 1)

 

壓縮導入至hdfs的數據  可以指定格式

bin/sqoop import \
--connect jdbc:mysql://hadoop-senior.ibeifeng.com:3306/test \
--username root \
--password 123456 \
--table my_user \
--target-dir /user/beifeng/sqoop/imp_my_sannpy \
--delete-target-dir \
--num-mappers 1 \
--compress \
--compression-codec org.apache.hadoop.io.compress.SnappyCodec \
--fields-terminated-by '\t'

ps:compress  這個屬性 是 開啟壓縮功能

      compression-codec  這個屬性是 指定壓縮的壓縮碼  本次是SnappyCodec

 


免責聲明!

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



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