關(guān)于我們
書單推薦
新書推薦
|
大數(shù)據(jù)離線分析
本書內(nèi)容包括大數(shù)據(jù)離線分析概述、Hive數(shù)據(jù)庫表、基于HiveQL的常規(guī)操作、視圖、索引和Pig等數(shù)據(jù)處理分析等基礎(chǔ)工具知識, 還有Hive函數(shù)、Pig Latin編程、ETL工具Sqoop和工作流引擎Oozie等相關(guān)高級技術(shù)。
大數(shù)據(jù)離線處理目前技術(shù)上已經(jīng)成熟。Hadoop框架是主流技術(shù),使用HDFS存儲數(shù)據(jù),使用MapReduce做批量計(jì)算;需要數(shù)據(jù)倉庫的存入Hive,然后從Hive進(jìn)行分析和展現(xiàn);涉及復(fù)雜業(yè)務(wù)場景時,使用Sqoop、Pig、Oozie等工具會更靈活方便。本書綜合了大數(shù)據(jù)離線分析所需的主流技術(shù),并配以案例和豐富的輔助學(xué)習(xí)資源,足以滿足廣大學(xué)習(xí)者入門的需要。
為什么要寫這本書
數(shù)據(jù)時代(DataTime)的到來使大數(shù)據(jù)技術(shù)得到了學(xué)術(shù)界和產(chǎn)業(yè)界的重視,并獲得了快速發(fā)展。隨著全球數(shù)字化、移動互聯(lián)網(wǎng)和物聯(lián)網(wǎng)在各行各業(yè)的應(yīng)用發(fā)展,使累積的數(shù)據(jù)量越來越大。諸多先行的企業(yè)、行業(yè)和國家已經(jīng)證明,利用大數(shù)據(jù)技術(shù)可以更好地服務(wù)客戶、發(fā)現(xiàn)新商業(yè)機(jī)會、擴(kuò)大新市場、轉(zhuǎn)換新動能。 當(dāng)前正處于大數(shù)據(jù)產(chǎn)業(yè)發(fā)展的前期,市場需求日趨旺盛,但是人才缺口巨大,技術(shù)支撐嚴(yán)重不足,大數(shù)據(jù)專業(yè)知識的廣泛傳播非常緊迫。 本書基于教育部“2016年產(chǎn)學(xué)合作協(xié)同育人項(xiàng)目”——普開數(shù)據(jù)教學(xué)內(nèi)容和課程體系改革項(xiàng)目,作為項(xiàng)目成果公開出版。北京普開數(shù)據(jù)技術(shù)有限公司在多屆全國高校教師培訓(xùn)工作中起到了“種子”教師培養(yǎng)的作用,本書編者都是在培訓(xùn)過程中結(jié)識并展開合作的;同時在本書編寫過程中,公司給予了強(qiáng)力支持,在此表示感謝。 讀者對象 (1)學(xué)習(xí)大數(shù)據(jù)離線分析的本科和高職高專學(xué)生。 (2)從事數(shù)據(jù)分析相關(guān)工作的技術(shù)人員。 如何閱讀本書 本書主要介紹了基于Hadoop生態(tài)圈的大數(shù)據(jù)離線處理技術(shù)。主流的大數(shù)據(jù)離線分析技術(shù)一般包括:使用HDFS存儲數(shù)據(jù),使用MapReduce做批量計(jì)算;需要數(shù)據(jù)倉庫的存入Hive,從Hive進(jìn)行分析和展現(xiàn);涉及復(fù)雜業(yè)務(wù)場景時,使用Sqoop、Pig、Oozie等工具會更加靈活方便。 本書略過了HDFS存儲數(shù)據(jù)、MapReduce批量計(jì)算的相關(guān)內(nèi)容。HDFS是Hadoop提供的分布式存儲框架,它可以用來存儲海量數(shù)據(jù),MapReduce是Hadoop提供的分布式計(jì)算框架,它可以用來統(tǒng)計(jì)和分析HDFS上的海量數(shù)據(jù)。該部分內(nèi)容為Hadoop基礎(chǔ)知識,讀者如果需要深入學(xué)習(xí),可以參考其他書籍或材料(如清華大學(xué)出版社2016年6月出版的《大數(shù)據(jù)技術(shù)基礎(chǔ)》)。 本書內(nèi)容是重點(diǎn)圍繞Hive數(shù)據(jù)倉庫展開的,Hive在Hadoop上提供了SQL接口,開發(fā)人員只需要編寫簡單易上手的SQL語句就可以實(shí)現(xiàn)創(chuàng)建表、刪除表、加載數(shù)據(jù)、下載數(shù)據(jù)、分析數(shù)據(jù)等功能,讀者可以從目錄的章節(jié)名稱中快速檢索并學(xué)習(xí)各方面的知識。 同時,本書針對離線分析過程中的工程任務(wù)場景還提供了一些輔助工具介紹。Sqoop解決在Hadoop和關(guān)系數(shù)據(jù)庫之間傳遞數(shù)據(jù)的問題,如果讀者有這方面的基礎(chǔ)或?qū)ζ渌鸈TL工具更熟悉,可以略過。Pig為大型數(shù)據(jù)集的處理提供了更高層次的抽象,以更靈活方便的方法實(shí)現(xiàn)加載數(shù)據(jù)、表達(dá)轉(zhuǎn)換數(shù)據(jù)和存儲最終結(jié)果,有這方面基礎(chǔ)或暫無需求的讀者可以略過書中第6、7章。Oozie實(shí)現(xiàn)對系統(tǒng)中多任務(wù)的管理,當(dāng)平臺中任務(wù)數(shù)量很大、需要維大數(shù)據(jù) 離線分析 前言 護(hù)和運(yùn)行時,Oozie可以方便地完成調(diào)度監(jiān)控這些任務(wù)的功能,對于僅處理簡單任務(wù)場景的讀者可以略過該部分內(nèi)容。 偏重實(shí)踐操作是本書的特色,書中所講內(nèi)容基本都配有實(shí)踐操作演示。通過每部分知識的學(xué)習(xí)和相應(yīng)操作環(huán)節(jié),可以很快地掌握技術(shù),并有很強(qiáng)的工程應(yīng)用場景感。本書最后提供了一個綜合應(yīng)用案例,讀者可以應(yīng)用所學(xué)知識實(shí)現(xiàn)一個工程項(xiàng)目,從而有效訓(xùn)練工程應(yīng)用開發(fā)能力。 勘誤和支持 由于本書編者水平有限,書中難免會出現(xiàn)一些錯誤或者不準(zhǔn)確的地方,懇請讀者批評、指正。如果在教材使用中遇到問題,或者要學(xué)習(xí)更多相關(guān)內(nèi)容,請關(guān)注微信號或聯(lián)系普開數(shù)據(jù)在線實(shí)驗(yàn)平臺。 編者
緒論001
第1章走進(jìn)Hive003 1.1Hive簡介003 1.1.1Hive發(fā)展史003 1.1.2體系結(jié)構(gòu)004 1.2Hive的安裝部署005 1.2.1安裝配置Hive005 1.2.2啟動Hive008 1.3Hive命令009 1.3.1Hive命令行選項(xiàng)009 1.3.2CLI命令行界面010 1.3.3Hive中CLI命令的快速編輯011 1.3.4Hive中的腳本011 1.3.5dfs命令的執(zhí)行013 1.4數(shù)據(jù)類型和文件格式014 1.4.1基本數(shù)據(jù)類型014 1.4.2集合數(shù)據(jù)類型015 1.4.3文本文件數(shù)據(jù)編碼016 本章小結(jié)018 習(xí)題018 第2章HiveQL數(shù)據(jù)定義020 2.1數(shù)據(jù)庫的創(chuàng)建與查詢020 2.2數(shù)據(jù)庫的修改與刪除021 2.3創(chuàng)建表022 2.3.1管理表023 2.3.2外部表023 2.3.3查看表結(jié)構(gòu)024 2.4修改表025 2.5刪除表026大數(shù)據(jù) 離線分析 目錄 2.6分區(qū)表027 2.6.1外部分區(qū)表028 2.6.2自定義表的存儲格式030 2.6.3增加、修改和刪除分區(qū)表031 2.7桶表031 本章小結(jié)032 習(xí)題033 第3章HiveQL數(shù)據(jù)操作034 3.1數(shù)據(jù)加載與導(dǎo)出034 3.1.1數(shù)據(jù)加載034 3.1.2數(shù)據(jù)導(dǎo)出036 3.2數(shù)據(jù)查詢037 3.2.1SELECT ... FROM語句037 3.2.2WHERE語句040 3.2.3GROUP BY語句與HAVING語句042 3.2.4JOIN語句043 3.2.5ORDER BY語句和SORT BY語句046 3.2.6CLUSTER BY語句047 3.2.7UNION ALL語句048 3.3抽樣查詢048 3.3.1數(shù)據(jù)塊抽樣049 3.3.2分桶表的輸入裁剪049 本章小結(jié)051 習(xí)題051 第4章HiveQL視圖和索引052 4.1視圖052 4.1.1創(chuàng)建視圖052 4.1.2顯示視圖053 4.1.3刪除視圖054 4.2索引054 4.2.1創(chuàng)建索引055 4.2.2重建索引055 4.2.3顯示索引056 4.2.4刪除索引056 本章小結(jié)057 習(xí)題057 第5章Hive的函數(shù)058 5.1函數(shù)簡介058 5.1.1發(fā)現(xiàn)和描述函數(shù)058 5.1.2調(diào)用函數(shù)059 5.1.3標(biāo)準(zhǔn)函數(shù)059 5.1.4聚合函數(shù)061 5.1.5表生成函數(shù)067 5.2用戶自定義函數(shù)UDF068 5.3用戶自定義聚合函數(shù)UDAF072 5.4用戶自定義表生成函數(shù)UDTF074 5.5UDF的標(biāo)注075 5.5.1定數(shù)性標(biāo)注(deterministic)076 5.5.2狀態(tài)性標(biāo)注(stateful)076 5.5.3唯一性標(biāo)注(distinctLike)076 本章小結(jié)076 習(xí)題077 第6章認(rèn)識Pig078 6.1初識Pig078 6.1.1Pig是什么078 6.1.2Pig的應(yīng)用場景078 6.1.3Pig的設(shè)計(jì)思想079 6.1.4Pig的發(fā)展簡史080 6.2安裝、運(yùn)行Pig080 6.2.1安裝Pig080 6.2.2運(yùn)行Pig081 本章小結(jié)082 習(xí)題082 第7章Pig基礎(chǔ)084 7.1命令行工具Grunt084 7.1.1輸入Pig Latin腳本084 7.1.2使用HDFS命令085 7.1.3控制Pig087 7.2Pig數(shù)據(jù)類型088 7.2.1基本類型088 7.2.2復(fù)雜類型089 7.2.3NULL值089 7.2.4類型轉(zhuǎn)換090 本章小結(jié)092 習(xí)題092 第8章Pig Latin編程093 8.1Pig Latin介紹093 8.1.1基礎(chǔ)知識093 8.1.2輸入和輸出094 8.2關(guān)系操作095 8.2.1foreach語句096 8.2.2filter語句096 8.2.3group語句097 8.2.4order語句097 8.2.5distinct語句098 8.2.6join語句098 8.2.7limit語句098 8.2.8sample語句099 8.2.9parallel語句099 8.3用戶自定義函數(shù)UDF101 8.3.1注冊UDF102 8.3.2define命令和UDF103 8.3.3調(diào)用Java函數(shù)104 8.4開發(fā)工具104 8.4.1describe104 8.4.2explain105 8.4.3illustrate107 8.4.4Pig統(tǒng)計(jì)信息109 8.4.5M/R作業(yè)狀態(tài)信息111 8.4.6調(diào)試技巧112 本章小結(jié)113 習(xí)題113 第9章數(shù)據(jù)ETL工具Sqoop115 9.1安裝Sqoop115 9.2數(shù)據(jù)導(dǎo)入117 9.2.1導(dǎo)入實(shí)例118 9.2.2導(dǎo)入數(shù)據(jù)的使用119 9.2.3數(shù)據(jù)導(dǎo)入代碼生成120 9.3數(shù)據(jù)導(dǎo)出121 9.3.1導(dǎo)出實(shí)例121 9.3.2導(dǎo)出和SequenceFile123 本章小結(jié)123 習(xí)題124 第10章Hadoop工作流引擎Oozie125 10.1Oozie是什么125 10.2Oozie的安裝125 10.3Oozie的編寫與運(yùn)行131 10.3.1Workflow組件131 10.3.2Coordinator組件133 10.3.3Bundle組件134 10.3.4作業(yè)的部署與執(zhí)行134 10.3.5向作業(yè)傳遞參數(shù)136 10.4Oozie控制臺136 10.4.1控制臺界面136 10.4.2獲取作業(yè)信息137 10.5Oozie的高級特性139 10.5.1自定義Oozie Workflow139 10.5.2使用Oozie JavaAPI141 本章小結(jié)143 習(xí)題143 第11章離線計(jì)算實(shí)例145 11.1微博歷史數(shù)據(jù)分析145 11.1.1數(shù)據(jù)結(jié)構(gòu)145 11.1.2需求分析146 11.1.3需求實(shí)現(xiàn)146 11.2電商銷售數(shù)據(jù)分析160 11.2.1數(shù)據(jù)結(jié)構(gòu)160 11.2.2需求分析161 11.2.3需求實(shí)現(xiàn)161 本章小結(jié)169 參考文獻(xiàn)
第章
3 HiveQL數(shù)據(jù)操作 本章摘要 在第2章中學(xué)習(xí)了管理表、外部表、分區(qū)表和桶表的概念,并且學(xué)習(xí)了創(chuàng)建、修改和刪除表。在本章中將學(xué)習(xí)如何對Hive表中的數(shù)據(jù)進(jìn)行操作。 首先,將學(xué)習(xí)如何把數(shù)據(jù)加載到表中,以及如何把表中的數(shù)據(jù)導(dǎo)出到指定的位置;其次,作為本章最重要的部分,將要學(xué)習(xí)一些數(shù)據(jù)查詢語句,包括簡單的查詢語句和復(fù)雜的查詢語句,因?yàn)楹枚嘤脩粜枨笮枰ㄟ^查詢語句得出結(jié)果;最后,簡單介紹抽樣查詢。 3.1數(shù)據(jù)加載與導(dǎo)出 本節(jié)主要學(xué)習(xí)如何往表中加載數(shù)據(jù),以及怎么導(dǎo)出數(shù)據(jù)。數(shù)據(jù)加載的幾種主要方式:從本地系統(tǒng)中導(dǎo)入數(shù)據(jù)到Hive表中、從HDFS上導(dǎo)入數(shù)據(jù)到Hive表中、通過查詢語句向Hive表中導(dǎo)入數(shù)據(jù),以及動態(tài)分區(qū)插入數(shù)據(jù);數(shù)據(jù)導(dǎo)出包括如何導(dǎo)出數(shù)據(jù)和導(dǎo)到何處。 3.1.1數(shù)據(jù)加載 1.從本地系統(tǒng)中導(dǎo)入數(shù)據(jù)到Hive表中 實(shí)例:hive>LOADDATALOCALINPATH'/home/zkpk/empmessages'INTOTABLEemp_messages;本例是把本地文件empmessages中的數(shù)據(jù)導(dǎo)入創(chuàng)建的Hive表emp_messages中。通過這個實(shí)例,整理出通用的語句格式是:LOADDATALOCALINPATH'/本地文件路徑'INTOTABLEtablename;注意:關(guān)鍵字LOCAL不能漏掉。如果忘記此關(guān)鍵字,則默認(rèn)從HDFS上去尋找所需要的數(shù)據(jù)文件路徑。 2.從HDFS上導(dǎo)入數(shù)據(jù)到Hive表中 實(shí)例:\[zkpk@master~\]$hadoopfs-put/home/zkpk/empmessages/data/emp_messages;由于已創(chuàng)建的管理表就在HDFS上,所以只需要將文件put到管理表所在的目錄就可以完成數(shù)據(jù)導(dǎo)入。通過這個實(shí)例,整理出來通用的語句格式是:hadoopfs-put'/數(shù)據(jù)所存放的本地路徑''/創(chuàng)建表時存放表的路徑'大數(shù)據(jù) 離線分析 0第3章 HiveQL數(shù)據(jù)操作 03.通過查詢語句向Hive表中導(dǎo)入數(shù)據(jù) 通過查詢語句向一張Hive空表中導(dǎo)入數(shù)據(jù)的實(shí)例。hive>INSERTINTOTABLEemp_messagesSELECTFROMold_emp_messages;如該例所示,首次向表中插入數(shù)據(jù)時,語句為INSERTINTOTABLEtablenameSELECT...INTO...。 查看此時表中的數(shù)據(jù),驗(yàn)證執(zhí)行結(jié)果。使用OVERWRITE關(guān)鍵字時,可以覆蓋目標(biāo)表中原來相同partition中的所有數(shù)據(jù),如果目標(biāo)表中沒有partition,則覆蓋整個表。hive>INSERTOVERWRITETABLEemp_messagesSELECTFROMold_emp_messages;查看此時表中的數(shù)據(jù),驗(yàn)證執(zhí)行結(jié)果。4.動態(tài)分區(qū)插入數(shù)據(jù) 所謂動態(tài)分區(qū),也稱作動態(tài)分區(qū)插入,指的是插入目標(biāo)表時僅指定分區(qū)字段,不指定分區(qū)值,分區(qū)值是從原始表中取得的。靜態(tài)分區(qū)和動態(tài)分區(qū)的區(qū)別在于導(dǎo)入數(shù)據(jù)時,是手動輸入分區(qū)名稱,還是通過數(shù)據(jù)來判斷數(shù)據(jù)分區(qū)。如果一次插入上百上千個分區(qū)中,只寫插入的代碼就很多,這種場景就適合使用動態(tài)分區(qū)插入功能。 默認(rèn)情況下,Hive是支持動態(tài)分區(qū)插入的,但是并沒有開啟。開啟后,默認(rèn)是以“嚴(yán)格”模式執(zhí)行:要求至少有一列分區(qū)字段是靜態(tài)的。這有助于阻止因設(shè)計(jì)錯誤導(dǎo)致查詢產(chǎn)生大量的分區(qū)。表31描述了動態(tài)分區(qū)相關(guān)的屬性設(shè)置。表31動態(tài)分區(qū)屬性 屬性名稱默認(rèn)值描述hive.exec.dynamic.partitionfalse設(shè)置成true,表示開啟動態(tài)分區(qū)功能hive.exec.dynamic.partition.modestrict設(shè)置成nonstrict,表示允許所有分區(qū)都是動態(tài)的hive.exec.max.dynamic.partitions.pernode100每個Mapper或Reducer可以創(chuàng)建的最大動態(tài)分區(qū)個數(shù)。如果某個Mapper或Reducer嘗試創(chuàng)建大于這個值的分區(qū),則會拋出一個致命的錯誤信息hive.exec.max.dynamic.partitions1000一個動態(tài)分區(qū)創(chuàng)建語句可以創(chuàng)建的最大動態(tài)分區(qū)個數(shù)。如果超過這個值,則會拋出一個致命錯誤信息hive.exec.max.created.files100000全局可以創(chuàng)建的最大文件個數(shù)。有一個Hadoop計(jì)數(shù)器會跟蹤記錄創(chuàng)建了多少個文件,如果超過這個值,則會拋出一個致命錯誤信息在學(xué)習(xí)動態(tài)分區(qū)插入數(shù)據(jù)前,先學(xué)習(xí)靜態(tài)分區(qū)插入數(shù)據(jù)。所謂的靜態(tài)分區(qū)插入數(shù)據(jù)就是在寫插入語句時,分區(qū)的值為一個確定的值,通過如下的例子可以加深認(rèn)識。hive>INSERTOVERWRITETABLEtestparPARTITION(days='0328') >SELECTFROMtesttWHEREt.day='0328';接下來,查看一下插入的結(jié)果。動態(tài)分區(qū),顧名思義,就是在分區(qū)的字段值不確定的情況下進(jìn)行數(shù)據(jù)插入操作。hive>INSERTOVERWRITETABLEtestparPARTITION(days) >SELECTFROMtest;注意:如果分區(qū)是可以確定的,建議用靜態(tài)分區(qū)的方式。不要用動態(tài)分區(qū),因?yàn)閯討B(tài)分區(qū)的值是在reduce運(yùn)行階段確定的,也就是會把所有的記錄distributeby?上攵碛涗浄浅4蟮那闆r下,只有一個reduce處理,后果是不可想象的。然而,靜態(tài)分區(qū)在編譯階段已經(jīng)確定,不需要reduce處理。 3.1.2數(shù)據(jù)導(dǎo)出 數(shù)據(jù)導(dǎo)出可以分為:導(dǎo)出到本地文件系統(tǒng)中;導(dǎo)出到HDFS文件中;從一張表導(dǎo)出到另一張表中。 1.把數(shù)據(jù)導(dǎo)出到本地文件系統(tǒng)中hive>INSERTOVERWRITELOCALDIRECTORY'/home/zkpk/test' >SELECTFROMtest;執(zhí)行完上面的語句,在本地文件系統(tǒng)中查看有沒有導(dǎo)出數(shù)據(jù)的文件。2.把數(shù)據(jù)導(dǎo)出到HDFS文件中hive>INSERTOVERWRITEDIRECTORY'/data/test_1' >SELECTFROMtest;查看結(jié)果如下:3.從一張表導(dǎo)出到另一張表中hive>INSERTINTOTABLEtest_1 >SELECTFROMtest;查看結(jié)果如下: 如果數(shù)據(jù)文件恰好是用戶所需要的格式,那么只需要把數(shù)據(jù)復(fù)制到目標(biāo)路徑下。hadoopfs-cp/source_path/target_path 3.2數(shù)據(jù)查詢 在本節(jié)中,通過搜狗搜索日志分析系統(tǒng)案例來介紹一些常用的數(shù)據(jù)查詢語句。 創(chuàng)建表:hive>CREATETABLEsougou_20111230( >logdateSTRING, >uidSTRING, >keywordSTRING, >rankINT, >searchorderINT, >urlSTRING) >ROWFORMATDELIMITED >FIELDSTERMINATEDBY'\\t' >LOCATION'/data/sogou_20111230'; hive>CREATETABLEsougou_old_20111230( >logdateSTRING, >uidSTRING, >keywordSTRING, >rankINT, >searchorderINT, >urlSTRING) >ROWFORMATDELIMITED >FIELDSTERMINATEDBY'\\t' >LOCATION'/data/sogou_old_20111230';3.2.1SELECT...FROM語句 SELECT...FROM語句和MySQL中的語法是一致的,SELECT是SQL中的投影算子,F(xiàn)ROM子句標(biāo)識了從哪個表、視圖或嵌套查詢中選擇記錄。 查詢表sougou_20111230中的所有字段信息。一張表中的字段有可能非常多,當(dāng)用戶所需要查詢的字段只需要少數(shù)幾個時,把需要的字段列舉出來即可。對于集合數(shù)據(jù)類型,引用集合數(shù)據(jù)類型中的元素有以下方式。 (1)數(shù)組引用方式,其索引是從0開始的(和Java一樣),語句如下:SELECT字段名\[集合數(shù)據(jù)類型中的元素的位置\]FROMtablename;注意:引用一個不存在的元素將會返回NULL。 (2)為了引用一個MAP元素,用戶還可以使用ARRAY\[...\]語法,但是使用的鍵值是非整數(shù)索引。語句如下:SELECT字段名\[集合數(shù)據(jù)類型中的元素內(nèi)容\]FROMtablename;(3)為了引用STRUCT中的一個元素,用戶可以使用“.”符號,類似于“表的別名.列名”。SELECT字段名.集合中的某個元素FROMtablename;FROM子句在使用中還有以下用法和功能。 1.LIMIT語句 往往典型的查詢會返回多行數(shù)據(jù),有時候不需要查詢那么多行,這時候可以使用LIMIT關(guān)鍵字來限制行數(shù)。例如,查詢表sougou_20111230中5行數(shù)據(jù)。hive>SELECTFROMsougou_20111230LIMIT5;結(jié)果如下: ……
你還可能感興趣
我要評論
|