大數據離線處理目前技術上已經成熟。Hadoop框架是主流技術,使用HDFS存儲數據,使用MapReduce做批量計算;需要數據倉庫的存入Hive,然后從Hive進行分析和展現;涉及復雜業務場景時,使用Sqoop、Pig、Oozie等工具會更靈活方便。本書綜合了大數據離線分析所需的主流技術,并配以案例和豐富的輔助學習資源,足以滿足廣大學習者入門的需要。
為什么要寫這本書
數據時代(DataTime)的到來使大數據技術得到了學術界和產業界的重視,并獲得了快速發展。隨著全球數字化、移動互聯網和物聯網在各行各業的應用發展,使累積的數據量越來越大。諸多先行的企業、行業和國家已經證明,利用大數據技術可以更好地服務客戶、發現新商業機會、擴大新市場、轉換新動能。
當前正處于大數據產業發展的前期,市場需求日趨旺盛,但是人才缺口巨大,技術支撐嚴重不足,大數據專業知識的廣泛傳播非常緊迫。
本書基于教育部“2016年產學合作協同育人項目”——普開數據教學內容和課程體系改革項目,作為項目成果公開出版。北京普開數據技術有限公司在多屆全國高校教師培訓工作中起到了“種子”教師培養的作用,本書編者都是在培訓過程中結識并展開合作的;同時在本書編寫過程中,公司給予了強力支持,在此表示感謝。
讀者對象
(1)學習大數據離線分析的本科和高職高專學生。
(2)從事數據分析相關工作的技術人員。
如何閱讀本書
本書主要介紹了基于Hadoop生態圈的大數據離線處理技術。主流的大數據離線分析技術一般包括:使用HDFS存儲數據,使用MapReduce做批量計算;需要數據倉庫的存入Hive,從Hive進行分析和展現;涉及復雜業務場景時,使用Sqoop、Pig、Oozie等工具會更加靈活方便。
本書略過了HDFS存儲數據、MapReduce批量計算的相關內容。HDFS是Hadoop提供的分布式存儲框架,它可以用來存儲海量數據,MapReduce是Hadoop提供的分布式計算框架,它可以用來統計和分析HDFS上的海量數據。該部分內容為Hadoop基礎知識,讀者如果需要深入學習,可以參考其他書籍或材料(如清華大學出版社2016年6月出版的《大數據技術基礎》)。
本書內容是重點圍繞Hive數據倉庫展開的,Hive在Hadoop上提供了SQL接口,開發人員只需要編寫簡單易上手的SQL語句就可以實現創建表、刪除表、加載數據、下載數據、分析數據等功能,讀者可以從目錄的章節名稱中快速檢索并學習各方面的知識。
同時,本書針對離線分析過程中的工程任務場景還提供了一些輔助工具介紹。Sqoop解決在Hadoop和關系數據庫之間傳遞數據的問題,如果讀者有這方面的基礎或對其他ETL工具更熟悉,可以略過。Pig為大型數據集的處理提供了更高層次的抽象,以更靈活方便的方法實現加載數據、表達轉換數據和存儲最終結果,有這方面基礎或暫無需求的讀者可以略過書中第6、7章。Oozie實現對系統中多任務的管理,當平臺中任務數量很大、需要維大數據
離線分析
前言
護和運行時,Oozie可以方便地完成調度監控這些任務的功能,對于僅處理簡單任務場景的讀者可以略過該部分內容。
偏重實踐操作是本書的特色,書中所講內容基本都配有實踐操作演示。通過每部分知識的學習和相應操作環節,可以很快地掌握技術,并有很強的工程應用場景感。本書最后提供了一個綜合應用案例,讀者可以應用所學知識實現一個工程項目,從而有效訓練工程應用開發能力。
勘誤和支持
由于本書編者水平有限,書中難免會出現一些錯誤或者不準確的地方,懇請讀者批評、指正。如果在教材使用中遇到問題,或者要學習更多相關內容,請關注微信號或聯系普開數據在線實驗平臺。
編者
第章
3
HiveQL數據操作
本章摘要
在第2章中學習了管理表、外部表、分區表和桶表的概念,并且學習了創建、修改和刪除表。在本章中將學習如何對Hive表中的數據進行操作。
首先,將學習如何把數據加載到表中,以及如何把表中的數據導出到指定的位置;其次,作為本章最重要的部分,將要學習一些數據查詢語句,包括簡單的查詢語句和復雜的查詢語句,因為好多用戶需求需要通過查詢語句得出結果;最后,簡單介紹抽樣查詢。
3.1數據加載與導出
本節主要學習如何往表中加載數據,以及怎么導出數據。數據加載的幾種主要方式:從本地系統中導入數據到Hive表中、從HDFS上導入數據到Hive表中、通過查詢語句向Hive表中導入數據,以及動態分區插入數據;數據導出包括如何導出數據和導到何處。
3.1.1數據加載
1.從本地系統中導入數據到Hive表中
實例:hive>LOADDATALOCALINPATH'/home/zkpk/empmessages'INTOTABLEemp_messages;本例是把本地文件empmessages中的數據導入創建的Hive表emp_messages中。通過這個實例,整理出通用的語句格式是:LOADDATALOCALINPATH'/本地文件路徑'INTOTABLEtablename;注意:關鍵字LOCAL不能漏掉。如果忘記此關鍵字,則默認從HDFS上去尋找所需要的數據文件路徑。
2.從HDFS上導入數據到Hive表中
實例:\[zkpk@master~\]$hadoopfs-put/home/zkpk/empmessages/data/emp_messages;由于已創建的管理表就在HDFS上,所以只需要將文件put到管理表所在的目錄就可以完成數據導入。通過這個實例,整理出來通用的語句格式是:hadoopfs-put'/數據所存放的本地路徑''/創建表時存放表的路徑'大數據
離線分析
0第3章
HiveQL數據操作
03.通過查詢語句向Hive表中導入數據
通過查詢語句向一張Hive空表中導入數據的實例。hive>INSERTINTOTABLEemp_messagesSELECTFROMold_emp_messages;如該例所示,首次向表中插入數據時,語句為INSERTINTOTABLEtablenameSELECT...INTO...。
查看此時表中的數據,驗證執行結果。使用OVERWRITE關鍵字時,可以覆蓋目標表中原來相同partition中的所有數據,如果目標表中沒有partition,則覆蓋整個表。hive>INSERTOVERWRITETABLEemp_messagesSELECTFROMold_emp_messages;查看此時表中的數據,驗證執行結果。4.動態分區插入數據
所謂動態分區,也稱作動態分區插入,指的是插入目標表時僅指定分區字段,不指定分區值,分區值是從原始表中取得的。靜態分區和動態分區的區別在于導入數據時,是手動輸入分區名稱,還是通過數據來判斷數據分區。如果一次插入上百上千個分區中,只寫插入的代碼就很多,這種場景就適合使用動態分區插入功能。
默認情況下,Hive是支持動態分區插入的,但是并沒有開啟。開啟后,默認是以“嚴格”模式執行:要求至少有一列分區字段是靜態的。這有助于阻止因設計錯誤導致查詢產生大量的分區。表31描述了動態分區相關的屬性設置。表31動態分區屬性
屬性名稱默認值描述hive.exec.dynamic.partitionfalse設置成true,表示開啟動態分區功能hive.exec.dynamic.partition.modestrict設置成nonstrict,表示允許所有分區都是動態的hive.exec.max.dynamic.partitions.pernode100每個Mapper或Reducer可以創建的最大動態分區個數。如果某個Mapper或Reducer嘗試創建大于這個值的分區,則會拋出一個致命的錯誤信息hive.exec.max.dynamic.partitions1000一個動態分區創建語句可以創建的最大動態分區個數。如果超過這個值,則會拋出一個致命錯誤信息hive.exec.max.created.files100000全局可以創建的最大文件個數。有一個Hadoop計數器會跟蹤記錄創建了多少個文件,如果超過這個值,則會拋出一個致命錯誤信息在學習動態分區插入數據前,先學習靜態分區插入數據。所謂的靜態分區插入數據就是在寫插入語句時,分區的值為一個確定的值,通過如下的例子可以加深認識。hive>INSERTOVERWRITETABLEtestparPARTITION(days='0328')
>SELECTFROMtesttWHEREt.day='0328';接下來,查看一下插入的結果。動態分區,顧名思義,就是在分區的字段值不確定的情況下進行數據插入操作。hive>INSERTOVERWRITETABLEtestparPARTITION(days)
>SELECTFROMtest;注意:如果分區是可以確定的,建議用靜態分區的方式。不要用動態分區,因為動態分區的值是在reduce運行階段確定的,也就是會把所有的記錄distributeby。可想而知,表記錄非常大的情況下,只有一個reduce處理,后果是不可想象的。然而,靜態分區在編譯階段已經確定,不需要reduce處理。
3.1.2數據導出
數據導出可以分為:導出到本地文件系統中;導出到HDFS文件中;從一張表導出到另一張表中。
1.把數據導出到本地文件系統中hive>INSERTOVERWRITELOCALDIRECTORY'/home/zkpk/test'
>SELECTFROMtest;執行完上面的語句,在本地文件系統中查看有沒有導出數據的文件。2.把數據導出到HDFS文件中hive>INSERTOVERWRITEDIRECTORY'/data/test_1'
>SELECTFROMtest;查看結果如下:3.從一張表導出到另一張表中hive>INSERTINTOTABLEtest_1
>SELECTFROMtest;查看結果如下:
如果數據文件恰好是用戶所需要的格式,那么只需要把數據復制到目標路徑下。hadoopfs-cp/source_path/target_path
3.2數據查詢
在本節中,通過搜狗搜索日志分析系統案例來介紹一些常用的數據查詢語句。
創建表: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;結果如下:
……