CDH中Sqoop的使用心得

2021-09-21 18:11:50 字數 4197 閱讀 4215

cdh自帶兩個版本sqoop元件

這裡選擇1.4.6版本也就是sqoop1,1.99.5版本是sqoop2,是半成品,不支援關係型db到hive跟hbase,故不推薦使用

sqoop list-databases --connect jdbc:mysql: --username root –p111111
sqoop eval --connect jdbc:mysql: --username root--password 111111/ 

--query "select xi.*, jing.name,wang.latitude,wang.longitude /

from xi ,jing, wang /

where xi.id=jing.foreignid and wang.id=xi.id and xi.date>='2015-09-01' and xi.date<='2015-10-01'"

以上sqoop語句執行過後,可以確認sqoop執行正常,sqoop連線mysql正常。

qoop eval --connect jdbc:mysql: --username root--password 111111 / 

--query "select xi.*, jing.name,wang.latitude,wang.longitude /

from xi ,jing, wang /

where xi.id=jing.foreignid and wang.id=xi.id and xi.date>='2015-09-01' and xi.date<='2015-10-01' /

and /$conditions" /

--split-by date --hive-import -m 5 /

--target-dir /user/hive/warehouse/anqi_wang /

--hive-table anqi_wang

注意:

由於使用sqoop從mysql匯入資料到hive需要指定target-dir,因此匯入的是普通表而不能為外部表。

以下簡要列舉了sqoop的執行過程:

boundin**alsquery: select min(date), max(date) from (select xi.*, jing.name,wang.latitude,wang.longitude from xi ,jing, wang where xi.id=jing.foreignid and wang.id=xi.id and xi.date>='2015-09-01' and xi.date<='2015-10-01' and  (1 = 1) ) as t1

15/10/13 13:11:47 info mapreduce.jobsubmitter: number of splits:5

15/10/12 13:40:28 info mapreduce.job: map 0% reduce 0%

15/10/12 13:40:39 info mapreduce.job: map 20% reduce 0%

15/10/12 13:40:40 info mapreduce.job: map 40% reduce 0%

15/10/12 13:40:47 info mapreduce.job: map 60% reduce 0%

15/10/12 13:40:48 info mapreduce.job: map 80% reduce 0%

15/10/12 13:40:52 info mapreduce.job: map 100% reduce 0%

可以看出,–split-by設定後,job按設定值切分,切分個數為-m設定值(-m 5 不設定的話預設job切分數是4)。經檢驗,此種較複雜的sql語句,sqoop支援得很好。

可以看出mysql的decimal型別變成了hive中的double型別。此時需要在匯入時通過–map-column-hive 作出對映關係指定,如下所示:

sqoop import / 

--connect jdbc:mysql: --username anqi --password anqi_mima /

--query "select * from xi where date>='2015-09-16' and date<='2015-10-01' /

and /$conditions" /

--split-by date --hive-import -m 5 /

--map-column-hive cost="decimal",date="date" /

--target-dir /user/hive/warehouse/xi /

--hive-table xi

以上命令可以執行成功,然而hive列型別設定為decimal時,從mysql[decimal(12,2)]–>hive[decimal]會導致匯入後小數丟失。

事實上,在生產環境中,系統可能會定期從與業務相關的關係型資料庫向hadoop匯入資料,匯入數倉後進行後續離線分析。故我們此時不可能再將所有資料重新導一遍,此時我們就需要增量資料匯入這一模式了。

sqoop import /

--connect jdbc:mysql: /

--username root /

--password 123456 /

--query 「select order_id, name from order_table where /$conditions」 /

--target-dir /user/root/orders_all /

--split-by order_id /

-m 6 /

--check-column order_id /

--last-value 5201314

重要引數說明:

此方式要求原有表中有time欄位,它能指定乙個時間戳,讓sqoop把該時間戳之後的資料匯入至hadoop(這裡為hdfs)。因為後續訂單可能狀態會變化,變化後time字段時間戳也會變化,此時sqoop依然會將相同狀態更改後的訂單匯入hdfs,當然我們可以指定merge-key引數為orser_id,表示將後續新的記錄與原有記錄合併。

將時間列大於等於閾值的資料增量匯入hdfs

sqoop import /

--connect jdbc:mysql: 20.160:3306/testdb /

--username root /

--password transwarp /

--query 「select order_id, name from order_table where /$conditions」 /

--target-dir /user/root/order_all /

--split-by id /

-m 4 /

--incremental lastmodified /

--merge-key order_id /

--check-column time /

# remember this date !!!

--last-value 「2014-11-09 21:00:00」

重要引數說明:

我們知道通過 -m 引數能夠設定匯入資料的 map 任務數量,即指定了 -m 即表示匯入方式為併發匯入,這時我們必須同時指定 - -split-by 引數指定根據哪一列來實現雜湊分片,從而將不同分片的資料分發到不同 map 任務上去跑,避免資料傾斜。

Sqoop的一些使用心得

sqoop作為從關係型資料庫匯入hdfs的工具,我們在從關係型資料庫中匯出資料時可先做資料篩選,選定我們所要的資料,能大大的減輕資料負擔,即sql語句後加where條件的實現!經測試可執行sqoop指令碼如下 sqoop import connect jdbc oracle thin ip port...

MFC中CObList的使用心得

在mfc中coblist型別定義的變數可以用來儲存類物件,但是該類需要繼承cobject類。因為coblist存放cobject類物件的指標。示例 coblist list num 取出list中的元素時,取出的是指標,需要對cobject型別的指標進行型別轉換如下 plan oplan plan ...

PHP中json encode的使用心得

假設有這麼乙個url url 你好 data url url echo json encode data 得到這樣的輸出 首先發現中文經過encode之後變成了16進製制,這不是亂碼,只是單純現實方法變了,因為只需要直接通過反序列化就能得到原結果,如下 jsonstr data json decod...