Apache Sqoop Cookbook 英文版-翻譯學(xué)習(xí)!!
更多信息https://blue-shadow.top/
前幾章介紹了在源數(shù)據(jù)庫系統(tǒng)上有一個輸入表的用例, 您需要將表作為一個整體或一個部分傳輸?shù)?Hadoop 系統(tǒng)中。另一方面, 本章將重點介紹更高級的用例,
其中需要從多個表中導(dǎo)入數(shù)據(jù), 或者需要通過調(diào)用各種數(shù)據(jù)庫函數(shù)來自定義傳輸?shù)臄?shù)據(jù),對于本章我們稍微改變了測試表cities配猫。
4.1從兩張表中導(dǎo)入數(shù)據(jù)
問題
您需要導(dǎo)入一個主表;但是, 此表已規(guī)范化。需要導(dǎo)入的值存儲在一個字典表中, 主表僅包含指向字典中的值勒葱,而不是作為原始cities表中的自然鍵的外鍵笋除。
您希望在運行Sqoop之前解決處理這些值, 并導(dǎo)入實際值, 而不是使用counties表的數(shù)值鍵。
解決方案
使用free-form query導(dǎo)入來替換表導(dǎo)入, Sqoop 將允許您指定任何查詢來導(dǎo)入數(shù)據(jù)。使用 --query 參數(shù)來代替 --table 參數(shù), 以獲取你想傳輸?shù)臄?shù)據(jù)解总。
一個規(guī)范化表normcities和countries字典表,為了實現(xiàn)與導(dǎo)入非規(guī)范化表cities相同的輸出, 您可以使用以下 Sqoop 命令:
sqoop import \
--connect jdbc:mysql://mysql.example.com/sqoop \
--username sqoop \
--password sqoop \
--query 'SELECT normcities.id, \
countries.country, \
normcities.city \
FROM normcities \
JOIN countries USING(country_id) \
WHERE $CONDITIONS' \
--split-by id \
--target-dir cities
討論
free-form查詢導(dǎo)入是 Sqoop 的高級功能之一晓铆。與所有軟件高級功能一樣, 它賦予了軟件強大的功能,也就伴隨著重大責(zé)任勺良。
在使用free-form查詢導(dǎo)入時, 有很多事情需要注意。通過使用查詢導(dǎo)入, Sqoop 無法使用數(shù)據(jù)庫通過系統(tǒng)目錄獲取元數(shù)據(jù)骄噪。這也是個使用表導(dǎo)入的原因可能比等效的自由格式查詢快原因尚困。此外, 您還必須手動指定一些附加那些會被自動填充的參數(shù)。除了使用 --query參數(shù)外, 還需要指定參數(shù) --split-by到那些會執(zhí)行并行任務(wù)的列上链蕊,這個參數(shù)模式是綁定到主表中的主鍵上事甜。第三個需要的參數(shù)是 --target-dir,用來指定需要在HDFS導(dǎo)入數(shù)據(jù)的路徑。
Sqoop通過繼承Hadoop的并行性執(zhí)行進行高效數(shù)據(jù)傳輸滔韵。為了幫助Sqoop將查詢拆分為多個可以并行傳輸?shù)膲K,需要在查詢的where子句中包括 CONDITIONS陪蜻,強制要求sqoop只使用一個作業(yè)邦马,通過參數(shù)
--num-mappers 1 參數(shù),但是這個設(shè)置將會對性能造成影響宴卖。Sqoop會為查詢在執(zhí)行多個服務(wù)實例,用于不同的數(shù)據(jù)分片滋将。這個參數(shù)對于一個簡單的連接, 這不會
是一個問題, 但復(fù)雜的查詢建將會是問題。