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