大數(shù)據(jù)離線處理目前技術(shù)上已經(jīng)成熟。Hadoop框架是主流技術(shù),使用HDFS存儲(chǔ)數(shù)據(jù),使用MapReduce做批量計(jì)算;需要數(shù)據(jù)倉庫的存入Hive,然后從Hive進(jìn)行分析和展現(xiàn);涉及復(fù)雜業(yè)務(wù)場(chǎng)景時(shí),使用Sqoop、Pig、Oozie等工具會(huì)更靈活方便。本書綜合了大數(shù)據(jù)離線分析所需的主流技術(shù),并配以案例和豐富的輔助學(xué)習(xí)資源,足以滿足廣大學(xué)習(xí)者入門的需要。
為什么要寫這本書
數(shù)據(jù)時(shí)代(DataTime)的到來使大數(shù)據(jù)技術(shù)得到了學(xué)術(shù)界和產(chǎn)業(yè)界的重視,并獲得了快速發(fā)展。隨著全球數(shù)字化、移動(dòng)互聯(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ī)會(huì)、擴(kuò)大新市場(chǎng)、轉(zhuǎn)換新動(dòng)能。
當(dāng)前正處于大數(shù)據(jù)產(chǎn)業(yè)發(fā)展的前期,市場(chǎng)需求日趨旺盛,但是人才缺口巨大,技術(shù)支撐嚴(yán)重不足,大數(shù)據(jù)專業(yè)知識(shí)的廣泛傳播非常緊迫。
本書基于教育部“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é)識(shí)并展開合作的;同時(shí)在本書編寫過程中,公司給予了強(qiáng)力支持,在此表示感謝。
讀者對(duì)象
(1)學(xué)習(xí)大數(shù)據(jù)離線分析的本科和高職高專學(xué)生。
(2)從事數(shù)據(jù)分析相關(guān)工作的技術(shù)人員。
如何閱讀本書
本書主要介紹了基于Hadoop生態(tài)圈的大數(shù)據(jù)離線處理技術(shù)。主流的大數(shù)據(jù)離線分析技術(shù)一般包括:使用HDFS存儲(chǔ)數(shù)據(jù),使用MapReduce做批量計(jì)算;需要數(shù)據(jù)倉庫的存入Hive,從Hive進(jìn)行分析和展現(xiàn);涉及復(fù)雜業(yè)務(wù)場(chǎng)景時(shí),使用Sqoop、Pig、Oozie等工具會(huì)更加靈活方便。
本書略過了HDFS存儲(chǔ)數(shù)據(jù)、MapReduce批量計(jì)算的相關(guān)內(nèi)容。HDFS是Hadoop提供的分布式存儲(chǔ)框架,它可以用來存儲(chǔ)海量數(shù)據(jù),MapReduce是Hadoop提供的分布式計(jì)算框架,它可以用來統(tǒng)計(jì)和分析HDFS上的海量數(shù)據(jù)。該部分內(nèi)容為Hadoop基礎(chǔ)知識(shí),讀者如果需要深入學(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í)各方面的知識(shí)。
同時(shí),本書針對(duì)離線分析過程中的工程任務(wù)場(chǎng)景還提供了一些輔助工具介紹。Sqoop解決在Hadoop和關(guān)系數(shù)據(jù)庫之間傳遞數(shù)據(jù)的問題,如果讀者有這方面的基礎(chǔ)或?qū)ζ渌鸈TL工具更熟悉,可以略過。Pig為大型數(shù)據(jù)集的處理提供了更高層次的抽象,以更靈活方便的方法實(shí)現(xiàn)加載數(shù)據(jù)、表達(dá)轉(zhuǎn)換數(shù)據(jù)和存儲(chǔ)最終結(jié)果,有這方面基礎(chǔ)或暫無需求的讀者可以略過書中第6、7章。Oozie實(shí)現(xiàn)對(duì)系統(tǒng)中多任務(wù)的管理,當(dāng)平臺(tái)中任務(wù)數(shù)量很大、需要維大數(shù)據(jù)
離線分析
前言
護(hù)和運(yùn)行時(shí),Oozie可以方便地完成調(diào)度監(jiān)控這些任務(wù)的功能,對(duì)于僅處理簡單任務(wù)場(chǎng)景的讀者可以略過該部分內(nèi)容。
偏重實(shí)踐操作是本書的特色,書中所講內(nèi)容基本都配有實(shí)踐操作演示。通過每部分知識(shí)的學(xué)習(xí)和相應(yīng)操作環(huán)節(jié),可以很快地掌握技術(shù),并有很強(qiáng)的工程應(yīng)用場(chǎng)景感。本書最后提供了一個(gè)綜合應(yīng)用案例,讀者可以應(yīng)用所學(xué)知識(shí)實(shí)現(xiàn)一個(gè)工程項(xiàng)目,從而有效訓(xùn)練工程應(yīng)用開發(fā)能力。
勘誤和支持
由于本書編者水平有限,書中難免會(huì)出現(xiàn)一些錯(cuò)誤或者不準(zhǔn)確的地方,懇請(qǐng)讀者批評(píng)、指正。如果在教材使用中遇到問題,或者要學(xué)習(xí)更多相關(guān)內(nèi)容,請(qǐng)關(guān)注微信號(hào)或聯(lián)系普開數(shù)據(jù)在線實(shí)驗(yàn)平臺(tái)。
編者
第章
3
HiveQL數(shù)據(jù)操作
本章摘要
在第2章中學(xué)習(xí)了管理表、外部表、分區(qū)表和桶表的概念,并且學(xué)習(xí)了創(chuàng)建、修改和刪除表。在本章中將學(xué)習(xí)如何對(duì)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ù),以及動(dòng)態(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中。通過這個(gè)實(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)入。通過這個(gè)實(shí)例,整理出來通用的語句格式是:hadoopfs-put'/數(shù)據(jù)所存放的本地路徑''/創(chuàng)建表時(shí)存放表的路徑'大數(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ù)時(shí),語句為INSERTINTOTABLEtablenameSELECT...INTO...。
查看此時(shí)表中的數(shù)據(jù),驗(yàn)證執(zhí)行結(jié)果。使用OVERWRITE關(guān)鍵字時(shí),可以覆蓋目標(biāo)表中原來相同partition中的所有數(shù)據(jù),如果目標(biāo)表中沒有partition,則覆蓋整個(gè)表。hive>INSERTOVERWRITETABLEemp_messagesSELECTFROMold_emp_messages;查看此時(shí)表中的數(shù)據(jù),驗(yàn)證執(zhí)行結(jié)果。4.動(dòng)態(tài)分區(qū)插入數(shù)據(jù)
所謂動(dòng)態(tài)分區(qū),也稱作動(dòng)態(tài)分區(qū)插入,指的是插入目標(biāo)表時(shí)僅指定分區(qū)字段,不指定分區(qū)值,分區(qū)值是從原始表中取得的。靜態(tài)分區(qū)和動(dòng)態(tài)分區(qū)的區(qū)別在于導(dǎo)入數(shù)據(jù)時(shí),是手動(dòng)輸入分區(qū)名稱,還是通過數(shù)據(jù)來判斷數(shù)據(jù)分區(qū)。如果一次插入上百上千個(gè)分區(qū)中,只寫插入的代碼就很多,這種場(chǎng)景就適合使用動(dòng)態(tài)分區(qū)插入功能。
默認(rèn)情況下,Hive是支持動(dòng)態(tài)分區(qū)插入的,但是并沒有開啟。開啟后,默認(rèn)是以“嚴(yán)格”模式執(zhí)行:要求至少有一列分區(qū)字段是靜態(tài)的。這有助于阻止因設(shè)計(jì)錯(cuò)誤導(dǎo)致查詢產(chǎn)生大量的分區(qū)。表31描述了動(dòng)態(tài)分區(qū)相關(guān)的屬性設(shè)置。表31動(dòng)態(tài)分區(qū)屬性
屬性名稱默認(rèn)值描述hive.exec.dynamic.partitionfalse設(shè)置成true,表示開啟動(dòng)態(tài)分區(qū)功能hive.exec.dynamic.partition.modestrict設(shè)置成nonstrict,表示允許所有分區(qū)都是動(dòng)態(tài)的hive.exec.max.dynamic.partitions.pernode100每個(gè)Mapper或Reducer可以創(chuàng)建的最大動(dòng)態(tài)分區(qū)個(gè)數(shù)。如果某個(gè)Mapper或Reducer嘗試創(chuàng)建大于這個(gè)值的分區(qū),則會(huì)拋出一個(gè)致命的錯(cuò)誤信息hive.exec.max.dynamic.partitions1000一個(gè)動(dòng)態(tài)分區(qū)創(chuàng)建語句可以創(chuàng)建的最大動(dòng)態(tài)分區(qū)個(gè)數(shù)。如果超過這個(gè)值,則會(huì)拋出一個(gè)致命錯(cuò)誤信息hive.exec.max.created.files100000全局可以創(chuàng)建的最大文件個(gè)數(shù)。有一個(gè)Hadoop計(jì)數(shù)器會(huì)跟蹤記錄創(chuàng)建了多少個(gè)文件,如果超過這個(gè)值,則會(huì)拋出一個(gè)致命錯(cuò)誤信息在學(xué)習(xí)動(dòng)態(tài)分區(qū)插入數(shù)據(jù)前,先學(xué)習(xí)靜態(tài)分區(qū)插入數(shù)據(jù)。所謂的靜態(tài)分區(qū)插入數(shù)據(jù)就是在寫插入語句時(shí),分區(qū)的值為一個(gè)確定的值,通過如下的例子可以加深認(rèn)識(shí)。hive>INSERTOVERWRITETABLEtestparPARTITION(days='0328')
>SELECTFROMtesttWHEREt.day='0328';接下來,查看一下插入的結(jié)果。動(dòng)態(tài)分區(qū),顧名思義,就是在分區(qū)的字段值不確定的情況下進(jìn)行數(shù)據(jù)插入操作。hive>INSERTOVERWRITETABLEtestparPARTITION(days)
>SELECTFROMtest;注意:如果分區(qū)是可以確定的,建議用靜態(tài)分區(qū)的方式。不要用動(dòng)態(tài)分區(qū),因?yàn)閯?dòng)態(tài)分區(qū)的值是在reduce運(yùn)行階段確定的,也就是會(huì)把所有的記錄distributeby。可想而知,表記錄非常大的情況下,只有一個(gè)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)識(shí)了從哪個(gè)表、視圖或嵌套查詢中選擇記錄。
查詢表sougou_20111230中的所有字段信息。一張表中的字段有可能非常多,當(dāng)用戶所需要查詢的字段只需要少數(shù)幾個(gè)時(shí),把需要的字段列舉出來即可。對(duì)于集合數(shù)據(jù)類型,引用集合數(shù)據(jù)類型中的元素有以下方式。
(1)數(shù)組引用方式,其索引是從0開始的(和Java一樣),語句如下:SELECT字段名\[集合數(shù)據(jù)類型中的元素的位置\]FROMtablename;注意:引用一個(gè)不存在的元素將會(huì)返回NULL。
(2)為了引用一個(gè)MAP元素,用戶還可以使用ARRAY\[...\]語法,但是使用的鍵值是非整數(shù)索引。語句如下:SELECT字段名\[集合數(shù)據(jù)類型中的元素內(nèi)容\]FROMtablename;(3)為了引用STRUCT中的一個(gè)元素,用戶可以使用“.”符號(hào),類似于“表的別名.列名”。SELECT字段名.集合中的某個(gè)元素FROMtablename;FROM子句在使用中還有以下用法和功能。
1.LIMIT語句
往往典型的查詢會(huì)返回多行數(shù)據(jù),有時(shí)候不需要查詢那么多行,這時(shí)候可以使用LIMIT關(guān)鍵字來限制行數(shù)。例如,查詢表sougou_20111230中5行數(shù)據(jù)。hive>SELECTFROMsougou_20111230LIMIT5;結(jié)果如下:
……