Hadoop簡明教程 課件 第6、7章 數(shù)據(jù)倉庫Hive、內(nèi)存計算框架Spark_第1頁
Hadoop簡明教程 課件 第6、7章 數(shù)據(jù)倉庫Hive、內(nèi)存計算框架Spark_第2頁
Hadoop簡明教程 課件 第6、7章 數(shù)據(jù)倉庫Hive、內(nèi)存計算框架Spark_第3頁
Hadoop簡明教程 課件 第6、7章 數(shù)據(jù)倉庫Hive、內(nèi)存計算框架Spark_第4頁
Hadoop簡明教程 課件 第6、7章 數(shù)據(jù)倉庫Hive、內(nèi)存計算框架Spark_第5頁
已閱讀5頁,還剩130頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第6章數(shù)據(jù)倉庫Hive6.1.1數(shù)據(jù)倉庫簡介嵌入式系統(tǒng)基本概念數(shù)據(jù)倉庫是一個面向主題的、集成的、隨時間變化的、但信息本身相對穩(wěn)定的數(shù)據(jù)集合,用于支持企業(yè)或組織的管理決策。數(shù)據(jù)源是數(shù)據(jù)倉庫系統(tǒng)的基礎(chǔ),通常包括存放于關(guān)系數(shù)據(jù)庫中的各種業(yè)務(wù)處理數(shù)據(jù)、各類文檔數(shù)據(jù)、各類法律法規(guī)、市場信息和競爭對手的信息等等。數(shù)據(jù)倉庫就是整合多個數(shù)據(jù)源的歷史數(shù)據(jù)進行多角度、多維度的分析,并發(fā)現(xiàn)趨勢,幫助高層管理者或者業(yè)務(wù)分析人員做出商業(yè)戰(zhàn)略決策。6.1.2Hive簡介嵌入式系統(tǒng)基本概念

Hive最初由Facebook開發(fā),主要用于解決海量結(jié)構(gòu)化日志數(shù)據(jù)的離線分析。Hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供了類SQL查詢語言HiveQL(HiveQueryLanguage)。當(dāng)采用MapReduce作為執(zhí)行引擎時,Hive能將HiveQL語句轉(zhuǎn)變成MapReduce任務(wù)來執(zhí)行,讓不熟悉MapReduce的開發(fā)人員直接編寫HiveQL語句來實現(xiàn)對大規(guī)模數(shù)據(jù)的統(tǒng)計分析操作,大大降低了學(xué)習(xí)門檻,同時也提升了開發(fā)效率。6.1.2Hive簡介嵌入式系統(tǒng)基本概念

Hive作為Hadoop平臺上的數(shù)據(jù)倉庫工具,應(yīng)用非常廣泛,主要是因為它具有的特點十分適合數(shù)據(jù)倉庫的統(tǒng)計分析。首先,HiveQL查詢語句的語法結(jié)構(gòu)與傳統(tǒng)SQL語句的語法結(jié)構(gòu)幾乎一樣,開發(fā)人員不需要學(xué)習(xí)新的編程知識,而是使用HiveQL語句就能處理海量數(shù)據(jù),大大降低了編程難度。其次,數(shù)據(jù)倉庫存儲的是靜態(tài)數(shù)據(jù),對靜態(tài)數(shù)據(jù)的分析一般采用批處理方式,不需要快速響應(yīng)并得出結(jié)果,因而適合采用MapReduce進行批處理。再次,Hive本身提供了用來對數(shù)據(jù)進行提取、轉(zhuǎn)化和加載的工具,可以存儲、查詢和分析存儲在Hadoop中的海量數(shù)據(jù)。6.1.3Hive與關(guān)系型數(shù)據(jù)庫的區(qū)別嵌入式系統(tǒng)基本概念表6-1Hive與關(guān)系型數(shù)據(jù)庫的區(qū)別對比內(nèi)容Hive關(guān)系型數(shù)據(jù)庫查詢語言HiveQLSQL數(shù)據(jù)存儲位置HDFS本地文件系統(tǒng)數(shù)據(jù)更新不支持支持索引支持有限索引支持復(fù)雜索引分區(qū)支持支持執(zhí)行引擎MapReduce、Spark、Tez自身的執(zhí)行引擎執(zhí)行延遲高低擴展性好有限數(shù)據(jù)規(guī)模大小6.1.4Hive系統(tǒng)架構(gòu)嵌入式系統(tǒng)基本概念

1.元數(shù)據(jù)元數(shù)據(jù)(Metastore)需要存儲在關(guān)系型數(shù)據(jù)庫中,Hive默認使用Derby作為存儲引擎,但一般推薦使用MySQL存儲元數(shù)據(jù)。元數(shù)據(jù)主要包含表的模式信息,如表名、表所屬的數(shù)據(jù)庫、表的屬性、表的列及其屬性、表的分區(qū)及其屬性、表中數(shù)據(jù)所在位置信息等。2.驅(qū)動驅(qū)動(Driver)包括編譯器(Compiler)、優(yōu)化器(Optimizer)和執(zhí)行器(Executor)等,可以采用MapReduce、Spark或Tez作為執(zhí)行引擎,當(dāng)采用MapReduce作為執(zhí)行引擎時,Hive能將HiveQL語句轉(zhuǎn)換成一系列MapReduce作業(yè)。6.1.4Hive系統(tǒng)架構(gòu)嵌入式系統(tǒng)基本概念

圖6-1Hive系統(tǒng)架構(gòu)6.1.4Hive系統(tǒng)架構(gòu)嵌入式系統(tǒng)基本概念

3.用戶接口用戶接口包括CLI、Beeline、HWI、JDBC、ODBC、ThriftServer等,用來實現(xiàn)外部應(yīng)用對Hive的訪問。CLI(CommmandLineInterface)是Hive自帶的命令行客戶端工具,是非常常用的一種用戶接口。Beeline是Hive新的命令行客戶端工具,類似于CLI,功能更強大,支持嵌入模式和遠程模式連接Hiveserver2服務(wù)來操作Hive。HWI(HiveWebInterface)是Hive的Web訪問接口,提供了一種可以通過瀏覽器來訪問Hive的服務(wù)。JDBC、ODBC以及ThriftServer可以向用戶提供進行編程訪問的接口。6.3Hive編程基礎(chǔ)嵌入式系統(tǒng)基本概念

HiveQL是一門類SQL語言,它與大部分SQL語法兼容,但并不完全支持SQL標(biāo)準(zhǔn),如HiveQL不支持事務(wù),也不支持更新操作,它主要用于分析處理存儲在HDFS中的結(jié)構(gòu)化數(shù)據(jù)。6.3.1Hive的數(shù)據(jù)類型嵌入式系統(tǒng)基本概念

表6-2Hive常用的基本數(shù)據(jù)類型類型描述示例TINYINT1個字節(jié)有符號整數(shù)2SMALLINT2個字節(jié)有符號整數(shù)2INT4個字節(jié)有符號整數(shù)2BIGINT8個字節(jié)有符號整數(shù)2FLOAT4個字節(jié)單精度浮點數(shù)2.0DOUBLE8個字節(jié)雙精度浮點數(shù)2.0BOOLEAN布爾類型,true/falsefalseSTRING字符串“hadoop”TIMESTAMP時間戳1234562236DATE日期‘2022-3-18’BINARY字節(jié)數(shù)組[0,1,2,3,0,1,2]6.3.1Hive的數(shù)據(jù)類型嵌入式系統(tǒng)基本概念

表6-3Hive的集合數(shù)據(jù)類型類型描述示例ARRAY數(shù)組,存儲相同類型的數(shù)據(jù),索引從0開始Array(1,2,3)MAP一組無序的鍵值對,鍵的類型必須是原子的,值可以是任何數(shù)據(jù)類型,同一個映射的鍵和值的類型必須相同Map(‘a(chǎn)’,2,

‘c’,1)STRUCT一組命名的字段,字段類型可以不同Struct(‘c’,2,0,1)6.3.2數(shù)據(jù)庫相關(guān)操作嵌入式系統(tǒng)基本概念

1.創(chuàng)建數(shù)據(jù)庫例如,創(chuàng)建數(shù)據(jù)庫testdb,命令如下:hive>createdatabasetestdb;

如果testdb數(shù)據(jù)庫已經(jīng)存在,再創(chuàng)建testdb數(shù)據(jù)庫就會拋出異常,加上ifnotexists關(guān)鍵字,可以避免拋出異常,命令如下:

hive>createdatabaseifnotexiststestdb;6.3.2數(shù)據(jù)庫相關(guān)操作嵌入式系統(tǒng)基本概念

2.查看數(shù)據(jù)庫描述信息例如,查看testdb的描述信息,命令如下:hive>describedatabasetestdb;3.將某個數(shù)據(jù)庫設(shè)置為用戶當(dāng)前的工作數(shù)據(jù)庫例如,將testdb設(shè)置為用戶當(dāng)前的工作數(shù)據(jù)庫,命令如下:hive>usetestdb;6.3.2數(shù)據(jù)庫相關(guān)操作嵌入式系統(tǒng)基本概念

4.顯示所有的數(shù)據(jù)庫hive>showdatabases;5.刪除數(shù)據(jù)庫例如,刪除testdb,命令如下:hive>dropdatabasetestdb;當(dāng)數(shù)據(jù)庫中存在表時,需要加cascade才能刪除,命令如下:hive>dropdatabasetestdbcascade;6.3.2數(shù)據(jù)庫相關(guān)操作嵌入式系統(tǒng)基本概念圖6-15數(shù)據(jù)庫相關(guān)操作6.3.3表相關(guān)操作嵌入式系統(tǒng)基本概念

1.創(chuàng)建表創(chuàng)建表的通用語句如下:CREATE[EXTERNAL]TABLE[IFNOTEXISTS]table_name

[(col_name

data_type[COMMENTcol_comment],...)]

[COMMENTtable_comment]

[PARTITIONEDBY(col_name

data_type[COMMENTcol_comment],...)]

[CLUSTEREDBY(col_name,col_name,...)

[SORTEDBY(col_name[ASC|DESC],...)]INTOnum_bucketsBUCKETS]

[ROWFORMATrow_format]

[STOREDASfile_format]

[LOCATIONhdfs_path]6.3.3表相關(guān)操作嵌入式系統(tǒng)基本概念可使用CREATETABLEtable_name命令創(chuàng)建一個指定表名的表。如果相同名字的表已經(jīng)存在,則會拋出異常,加上IFNOTEXISTS關(guān)鍵字,可以避免拋出異常。下面介紹常用的可選項:Hive中有兩種表:內(nèi)部表和外部表。Hive默認創(chuàng)建的表都是內(nèi)部表,每一個表在該數(shù)據(jù)倉庫目錄下都擁有一個對應(yīng)的目錄,用于存儲數(shù)據(jù)。當(dāng)刪除一個內(nèi)部表時,Hive會同時刪除元數(shù)據(jù)和這個數(shù)據(jù)目錄。內(nèi)部表不適合和其它工具共享數(shù)據(jù)。6.3.3表相關(guān)操作嵌入式系統(tǒng)基本概念

EXTERNAL關(guān)鍵字可以讓編程人員創(chuàng)建一個外部表,在創(chuàng)建表的同時指定數(shù)據(jù)讀取的路徑(LOCATION),外部表僅記錄數(shù)據(jù)所在的路徑,不對數(shù)據(jù)的位置做任何改變。當(dāng)刪除表時,外部表只刪除元數(shù)據(jù),數(shù)據(jù)文件不會刪除。

Hive中的分區(qū)就是分目錄,把一個大的數(shù)據(jù)集根據(jù)業(yè)務(wù)需要分割成小的數(shù)據(jù)集。分區(qū)的好處是可以讓數(shù)據(jù)按照區(qū)域進行分類,查詢時避免全表掃描。我們可以使用PARTITIONEDBY語句創(chuàng)建有分區(qū)的表,表和分區(qū)都可以對某個列進行CLUSTEREDBY操作。6.3.3表相關(guān)操作嵌入式系統(tǒng)基本概念

1,Tom,85.0,A2,Barry,81.0,C3,Rich,87.0,B4,George,83.0,B5,Jones,86.0,A6,Mark,97.0,C7,Ulf,96.0,C8,Jery,89.0,A9,Alice,91.0,B10,David,80.0,C6.3.3表相關(guān)操作嵌入式系統(tǒng)基本概念

(1)創(chuàng)建內(nèi)部表例如,根據(jù)上述數(shù)據(jù)創(chuàng)建內(nèi)部表students,命令及執(zhí)行結(jié)果如圖6-16所示。由于students.txt以‘,’分割字段,所以在HiveQL中使用如下命令進行特別指定:rowformatdelimitedfieldsterminatedby','圖6-16創(chuàng)建內(nèi)部表students6.3.3表相關(guān)操作嵌入式系統(tǒng)基本概念

(2)創(chuàng)建外部表例如,根據(jù)上述數(shù)據(jù)創(chuàng)建外部表students2,命令及執(zhí)行結(jié)果如圖6-17所示。圖6-17創(chuàng)建外部表students26.3.3表相關(guān)操作嵌入式系統(tǒng)基本概念

2.查看表例如,查看當(dāng)前數(shù)據(jù)庫中的表,命令如下:

hive>showtables;3.查看表的結(jié)構(gòu)信息例如,查看students表的結(jié)構(gòu)信息,命令如下:hive>describestudents;6.3.3表相關(guān)操作嵌入式系統(tǒng)基本概念

圖6-18查看表及表結(jié)構(gòu)信息6.3.3表相關(guān)操作嵌入式系統(tǒng)基本概念

4.刪除表例如,刪除students表,命令如下:

hive>droptablestudents;6.3.4表中數(shù)據(jù)的加載嵌入式系統(tǒng)基本概念往表中加載數(shù)據(jù),就是采用某種方法,將數(shù)據(jù)文件按表的規(guī)則放置在表所屬的目錄下。加載數(shù)據(jù)的語法規(guī)則如下:LOADDATA[LOCAL]INPATH'filepath'[OVERWRITE]INTOTABLEtablename[PARTITION(partcol1=val1,partcol2=val2...)]6.3.4表中數(shù)據(jù)的加載嵌入式系統(tǒng)基本概念各參數(shù)的含義如下:

filepath:表示被加載數(shù)據(jù)文件的路徑。LOCAL:為可選關(guān)鍵字,命令中有該關(guān)鍵字時,INPATH后的路徑代表的是本地文件系統(tǒng)上的路徑,沒有該關(guān)鍵字時,INPATH后的路徑代表的是HDFS上的路徑。OVERWRITE:為可選關(guān)鍵字,命令中有該關(guān)鍵字時,表tablename中的數(shù)據(jù)將被刪除,然后再把filepath中的文件導(dǎo)入到表tablename下。6.3.4表中數(shù)據(jù)的加載嵌入式系統(tǒng)基本概念

1.從本地加載數(shù)據(jù)到Hive表例如,加載本地文件students.txt中的數(shù)據(jù)到students表,命令及執(zhí)行結(jié)果如圖6-19所示。其中,“l(fā)ocal”表示INPATH后的路徑代表的是本地文件系統(tǒng)上的路徑;“overwrite”表示加載的數(shù)據(jù)將覆蓋原有數(shù)據(jù)。圖6-19加載本地數(shù)據(jù)到Hive表6.3.4表中數(shù)據(jù)的加載嵌入式系統(tǒng)基本概念2.從HDFS中加載數(shù)據(jù)到Hive表例如,從HDFS上加載students.txt中的數(shù)據(jù)到students2表,假設(shè)students.txt已上傳到HDFS的/test2目錄下,命令及執(zhí)行結(jié)果如圖6-20所示。圖6-20從HDFS中加載數(shù)據(jù)到Hive表6.3.5HiveQL基本查詢嵌入式系統(tǒng)基本概念

Hive查詢基本語法規(guī)則如下:

SELECT[ALL|DISTINCT]select_expr,select_expr,...FROMtable_reference[WHEREwhere_condition][GROUPBYcol_list][ORDERBYcol_list][CLUSTERBYcol_list|[DISTRIBUTEBYcol_list][SORTBYcol_list]][LIMITnumber]6.3.5HiveQL基本查詢嵌入式系統(tǒng)基本概念各參數(shù)的含義如下:ALL|DISTINCT:ALL指全部,是默認形式;DISTINCT會去掉查詢結(jié)果中的重復(fù)數(shù)據(jù)。FROM:指定所查詢的表,如果有多個表需要同時查詢,各表之間用“,”號分隔。WHERE:指定查詢表內(nèi)容的過濾條件。GROUPBY:指定按照哪些字段進行分組。

ORDERBY:對查詢結(jié)果進行全局排序。6.3.5HiveQL基本查詢嵌入式系統(tǒng)基本概念DISTRIBUTEBY:控制map結(jié)果的分發(fā),它會將具有相同Key的map輸出分發(fā)到同一個reduce節(jié)點上做處理。

SORTBY:對數(shù)據(jù)進行局部排序。CLUSTERBY:當(dāng)DISTRIBUTEBY和SORTBY所指定的字段相同時,且都是升序,CLUSTERBY就相當(dāng)于前兩個語句。LIMIT:指定查詢記錄的條數(shù)。6.3.5HiveQL基本查詢嵌入式系統(tǒng)基本概念

1.基本查詢例如,查詢students表中的所有記錄,命令及執(zhí)行結(jié)果如圖6-21所示。圖6-21基本查詢示例6.3.5HiveQL基本查詢嵌入式系統(tǒng)基本概念

2.where語句select語句用于選擇字段,where語句用于篩選條件,兩者結(jié)合使用,可查找出符合要求的信息。例如,查找students表中分數(shù)90分以上的學(xué)生姓名和分數(shù),命令及執(zhí)行結(jié)果如圖6-22所示。圖6-22where語句示例6.3.5HiveQL基本查詢嵌入式系統(tǒng)基本概念3.like和rlike語句like和rlike可以讓用戶通過字符串匹配來進行模糊查詢,%代表任意多個字符,其中rlike子句可以通過Java的正則表達式來指定匹配條件。例如,(1)查詢姓名以字母‘J’開頭的學(xué)生信息;(2)查詢姓名中包含字母‘o’的學(xué)生信息;命令及執(zhí)行結(jié)果如圖6-23所示。6.3.5HiveQL基本查詢嵌入式系統(tǒng)基本概念

圖6-23like和rlike語句示例6.3.5HiveQL基本查詢嵌入式系統(tǒng)基本概念

4.groupby語句groupby語句通常會和聚合函數(shù)一起使用,根據(jù)一個或多個列對結(jié)果集進行分組。然后對每個組執(zhí)行聚合操作。例如,查詢每個班的平均成績,命令及執(zhí)行結(jié)果如圖6-24所示。6.3.5HiveQL基本查詢嵌入式系統(tǒng)基本概念

圖6-24groupby語句示例6.3.5HiveQL基本查詢嵌入式系統(tǒng)基本概念

5.having語句having語句一般與groupby、聚合函數(shù)一起使用,用于對分組統(tǒng)計的結(jié)果進行過濾。例如,查詢平均成績大于或等于87的班級,命令及執(zhí)行結(jié)果如圖6-25所示。6.3.5HiveQL基本查詢嵌入式系統(tǒng)基本概念

圖6-25having語句示例6.3.5HiveQL基本查詢嵌入式系統(tǒng)基本概念6.orderby語句orderby語句用于根據(jù)指定的字段對結(jié)果集進行排序,默認是按asc升序排序,也可用desc指示降序排序。例如,查詢學(xué)生的姓名和成績,并按成績降序排列,命令及執(zhí)行結(jié)果如圖6-26所示。6.3.5HiveQL基本查詢嵌入式系統(tǒng)基本概念圖6-26orderby語句示例6.3.5HiveQL基本查詢嵌入式系統(tǒng)基本概念7.limit語句可以使用limit限制返回記錄的最大條數(shù)。例如,查詢成績前3名的學(xué)生信息,命令及執(zhí)行結(jié)果如圖6-27所示。6.3.5HiveQL基本查詢嵌入式系統(tǒng)基本概念

圖6-27limit語句示例6.3.5Hive函數(shù)嵌入式系統(tǒng)基本概念

Hive提供了大量的運算符和內(nèi)置函數(shù)供用戶使用,為常規(guī)業(yè)務(wù)的計算提供了很大的便利。這些運算符和函數(shù)包括:數(shù)值運算符、關(guān)系運算符、邏輯運算符、統(tǒng)計函數(shù)、字符串函數(shù)、條件函數(shù)、日期函數(shù)、聚集函數(shù)和處理XML和JSON的函數(shù)等。6.3.5Hive函數(shù)嵌入式系統(tǒng)基本概念

Hive提供了對函數(shù)的幫助提示信息命令。例如,查看函數(shù)列表命令如下:hive>showfunctions;查看sum函數(shù)的幫助信息,命令及執(zhí)行結(jié)果如圖6-28所示。圖6-28查看sum函數(shù)的幫助信息6.3.5Hive函數(shù)嵌入式系統(tǒng)基本概念

1.統(tǒng)計函數(shù)對數(shù)值型字段,可以用max()函數(shù)求最大值,用min()函數(shù)求最小值,用sum()函數(shù)求和,用avg()函數(shù)求平均值;還可以用count()函數(shù)統(tǒng)計記錄的條數(shù)。使用上述函數(shù),都會觸發(fā)MapReduce操作。例如,統(tǒng)計students表中記錄的條數(shù)、最高分、最低分、平均分和總分,命令及執(zhí)行結(jié)果如圖6-29所示。6.3.5Hive函數(shù)嵌入式系統(tǒng)基本概念

圖6-29統(tǒng)計函數(shù)示例6.3.5Hive函數(shù)嵌入式系統(tǒng)基本概念

2.distinct()函數(shù)

distinct()函數(shù)用于去除重復(fù)值。例如,查詢students表中存儲了多少個班級的學(xué)生,命令及執(zhí)行結(jié)果如圖6-29所示。6.3.5Hive函數(shù)圖6-30distinct()函數(shù)示例6.4.1雇員表統(tǒng)計嵌入式系統(tǒng)基本概念

【例6-1】假設(shè)在本地文件系統(tǒng)/user/data目錄下,有個名為employees.txt的文本文件,文件內(nèi)容如下:1,Rich,5835.0,12,Barry,7236.0,33,Ani,6125.0,54,George,8313.0,25,Ulf,7412.0,36,Tom,8313.0,67,Jiao,5646.0,28,Hni,6318.0,6其中,第1列為員工編號、第2列為姓名、第3列為月薪、第4列為部門編號,根據(jù)上述數(shù)據(jù),通過Hive編程完成以下操作:6.4.1雇員表統(tǒng)計嵌入式系統(tǒng)基本概念

1.創(chuàng)建數(shù)據(jù)庫emp。hive>createdatabaseemp;hive>useemp;2.創(chuàng)建employees表。hive>createtableemployees(idint,namestring,salarydouble,deptsstring)rowformatdelimitedfieldsterminatedby',';6.4.1雇員表統(tǒng)計嵌入式系統(tǒng)基本概念

3.導(dǎo)入數(shù)據(jù)employees.txt到employees表。hive>loaddatalocalinpath'/user/data/employees.txt'overwriteintotableemployees;4.查詢employees表中所有雇員的員工編號、姓名、年薪。hive>selectid,name,salary*12fromemployees;5.查看employees表中工資在5000至7000之間的記錄。hive>select*fromemployeeswheresalary>=5000andsalary<7000;6.查詢employees表部門編號不為3的員工編號、姓名、部門編號,并按員工編號降序排列hive>selectid,name,deptsfromemployeeswheredepts<>3orderbyiddesc;6.4.1雇員表統(tǒng)計嵌入式系統(tǒng)基本概念

7、將所有員工先按部門編號升序,當(dāng)部門一樣時,再按姓名降序排列hive>select*fromemployeesorderbydeptsasc,namedesc;8.查詢employees表每個部門的編號、平均工資hive>selectdepts,avg(salary)fromemployeesgroupbydepts;9.統(tǒng)計employees表中有多少個不重復(fù)部門hive>selectcount(distinctdepts)fromemployees;10.查詢employees表薪水大于6000的員工姓名及所在部門編號hive>selectname,deptsfromemployeeswheresalary>6000;6.4.1雇員表統(tǒng)計嵌入式系統(tǒng)基本概念

11.在employees表中,工資最高的員工姓名、薪水hive>selectname,salaryfromemployeesa,(selectmax(salary)max_salfromemployees)bwherea.salary=b.max_sal;12.在employees表中,工資高于平均工資員工姓名、薪水hive>selectname,salaryfromemployeesa,(selectavg(salary)avg_salfromemployees)bwherea.salary>b.avg_sal;13.查詢employees表平均年薪小于75000的部門編號、平均年薪hive>selectdepts,12*avg(salary)fromemployeesgroupbydeptshavingavg(salary)*12<75000;6.4.2詞頻統(tǒng)計嵌入式系統(tǒng)基本概念

【例6-2】假設(shè)在HDFS的/test2目錄下,有多個文本文件,每個文件存儲多個英文單詞,單詞之間用空格分隔。請Hive統(tǒng)計每個單詞出現(xiàn)的次數(shù)。6.4.2詞頻統(tǒng)計嵌入式系統(tǒng)基本概念

hive>createtablewordline(linestring);hive>loaddatainpath'/test2'overwriteintotablewordline;hive>createtablewordcountasselectword,count(1)ascountfrom(selectexplode(split(line,''))aswordfromwordline)wgroupbywordorderbyword;6.4.2詞頻統(tǒng)計嵌入式系統(tǒng)基本概念執(zhí)行完成后,可用select語句查看運行結(jié)果,如圖6-31所示。由于本例與第4章的WordCount統(tǒng)計同樣的文件,所以程序運行的結(jié)果一樣。圖6-31用select語句查看運行結(jié)果1.4.3YARN嵌入式系統(tǒng)基本概念

YARN(YetAnotherResourceNegotiator,另一種資源協(xié)調(diào)者)是一種新的Hadoop資源管理器,它是一個通用資源管理系統(tǒng),可為上層應(yīng)用提供統(tǒng)一的資源管理和調(diào)度,它的引入為集群在資源利用率、資源統(tǒng)一管理和數(shù)據(jù)共享等方面帶來了很大好處。YARN采用主從架構(gòu)(Master/Slave),包括:ResourceManager、ApplicationMaster和NodeManager三個核心組件。1.5Hadoop生態(tài)系統(tǒng)嵌入式系統(tǒng)基本概念

圖1-1hadoop的生態(tài)系統(tǒng)1.5.1HBase嵌入式系統(tǒng)基本概念HBase(HadoopDatabase,hadoop數(shù)據(jù)庫)是一個針對非結(jié)構(gòu)化數(shù)據(jù)的可伸縮、高可靠、高性能、分布式和面向列的開源數(shù)據(jù)庫,一般采用HDFS作為底層數(shù)據(jù)存儲系統(tǒng)。HBase是針對GoogleBigtable的開源實現(xiàn),二者采用相同數(shù)據(jù)模型,具有強大的非結(jié)構(gòu)化數(shù)據(jù)存儲能力。HBase使用ZooKeeper進行管理,它保障查詢速度的一個關(guān)鍵因素就是RowKey的設(shè)計是否合理。HBase中保存的數(shù)據(jù)可以使用MapReduce來處理。1.5.2Hive嵌入式系統(tǒng)基本概念

Hive是一個基于Hadoop的數(shù)據(jù)倉庫工具,最早由Facebook開發(fā)并使用。Hive可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供SQL查詢功能,這套SQL稱為HiveQL(HiveQueryLanguage)。當(dāng)采用MapReduce作為執(zhí)行引擎時,Hive能將HiveQL語句轉(zhuǎn)換成一系列MapReduce作業(yè),并提交到Hadoop集群上運行。Hive大大降低了學(xué)習(xí)門檻,同時也提升了開發(fā)效率,非常適合數(shù)據(jù)倉庫的統(tǒng)計分析。1.5.3Pig嵌入式系統(tǒng)基本概念

Pig是一種數(shù)據(jù)流語言和運行環(huán)境,用于檢索大規(guī)模的數(shù)據(jù)集。Pig定義了一種數(shù)據(jù)流語言—PigLatin,將腳本轉(zhuǎn)換為MapReduce任務(wù)在Hadoop上執(zhí)行,適合于使用Hadoop平臺來查詢大型半結(jié)構(gòu)化數(shù)據(jù)集。1.5.4Spark嵌入式系統(tǒng)基本概念

Spark(內(nèi)存計算框架)是專為大規(guī)模數(shù)據(jù)處理而設(shè)計的快速通用的計算引擎。Spark最初由美國加州伯克利大學(xué)的AMP實驗室于2009年開發(fā),是基于內(nèi)存計算的大數(shù)據(jù)并行計算框架,可用于構(gòu)建大型的、低延遲的數(shù)據(jù)分析應(yīng)用程序。Spark不同于MapReduce,它的Job中間輸出結(jié)果可以保存在內(nèi)存中,從而大大提高迭代運算效率,因此Spark能更好地適用于數(shù)據(jù)挖掘與機器學(xué)習(xí)等需要迭代算法。1.5.5ZooKeeper嵌入式系統(tǒng)基本概念

ZooKeeper(分布式協(xié)作服務(wù))是一個開源的分布式應(yīng)用程序協(xié)作框架,是GoogleChubby的開源的實現(xiàn),能為大型分布式系統(tǒng)提供了高效且可靠的分布式協(xié)調(diào)服務(wù),提供的功能包括:配置維護、統(tǒng)一命名、分布式同步、集群管理等。ZooKeeper可用于Hadoop、HBase、Kafka等大型分布式開源系統(tǒng),例如HBase高可用、HDFSNameNodeHA自動切換等都是通過ZooKeeper來實現(xiàn)的。1.5.6Sqoop嵌入式系統(tǒng)基本概念

Sqoop(數(shù)據(jù)庫ETL工具)是SQLtoHadoop的縮寫,主要用于關(guān)系數(shù)據(jù)庫和Hadoop之間傳輸數(shù)據(jù)。通過Sqoop可以將數(shù)據(jù)從關(guān)系型數(shù)據(jù)庫(MySQL、Oracle等)導(dǎo)入到到Hadoop生態(tài)系統(tǒng)(HDFS、HBase、Hive等),也可以將數(shù)據(jù)從Hadoop生態(tài)系統(tǒng)導(dǎo)出到關(guān)系型數(shù)據(jù)庫。導(dǎo)入導(dǎo)出過程由MapReduce計算框架實現(xiàn),非常高效。1.5.7Flume嵌入式系統(tǒng)基本概念

Flume(日志收集工具)是由Cloudera提供的一個高可用、高可靠、分布式的海量日志采集、聚合和傳輸?shù)南到y(tǒng)。Flume支持在日志系統(tǒng)中定制各類數(shù)據(jù)發(fā)送方,從而支持收集各種不同協(xié)議數(shù)據(jù)。同時,F(xiàn)lume提供對數(shù)據(jù)進行簡單處理的能力,如過濾、格式轉(zhuǎn)換等。1.5.8Mahout嵌入式系統(tǒng)基本概念

Mahout是Apache軟件基金會旗下的一個開源項目,提供一些可擴展的機器學(xué)習(xí)領(lǐng)域經(jīng)典算法的實現(xiàn),旨在幫助開發(fā)人員更加方便快捷地創(chuàng)建智能應(yīng)用程序。Mahout包含許多實現(xiàn),包括聚類、分類、推薦過濾、頻繁子項挖掘。此外,通過使用ApacheHadoop庫,Mahout可以有效地擴展到云中。1.5.9Ambari嵌入式系統(tǒng)基本概念

ApacheAmbari是一個基于Web的工具,支持ApacheHadoop集群的安裝、部署、配置和管理,Ambari目前已支持大多數(shù)Hadoop組件,包括HDFS、MapReduce、Hive、Pig、HBase、ZooKeeper、Sqoop等。第7章內(nèi)存計算框架Spark7.1.1Spark簡介嵌入式系統(tǒng)基本概念

Spark最初由UCBerkeleyAMPlab(加州大學(xué)伯克利分校的AMP實驗室)于2009年開發(fā),可用于構(gòu)建大型的、低延遲的數(shù)據(jù)分析應(yīng)用程序,是基于內(nèi)存計算的大數(shù)據(jù)并行計算框架。7.1.1Spark簡介嵌入式系統(tǒng)基本概念

Spark具有如下幾個主要特點:1.運行速度快與MapReduce相比,Spark可以支持包括Map和Reduce在內(nèi)的更多操作,這些操作相互連接形成一個有向無環(huán)圖(DirectedAcyclicGraph,DAG),各個操作的中間結(jié)果被保存在內(nèi)存中,因此,Spark的處理速度比MapReduce快得多。2.容易使用Spark可以使用Scala、Java、Python、R和SOL進行編程,還可以通過SparkShell進行交互式編程。7.1.1Spark簡介嵌入式系統(tǒng)基本概念

3.通用性Spark提供了完整而強大的技術(shù)棧,包括SQL查詢、流式計算、機器學(xué)習(xí)和圖算法等組件,開發(fā)者可以在同一個應(yīng)用程序中無縫組合地使用這些組件。4.運行模式多樣Spark支持多種運行模式:本地運行模式、分布式運行模式。Spark集群的底層資源可以借助于外部的框架進行管理,比如,Spark可以使用Hadoop的YARN和AppacheMesos作為它的資源管理和調(diào)度器,并且可以訪問HDFS、Cassandra、HBase、Hive等多種數(shù)據(jù)源。7.1.2Spark生態(tài)系統(tǒng)Spark的設(shè)計遵循“一個軟件棧滿足不同應(yīng)用場景”的理念,逐漸形成了一套完整的生態(tài)系統(tǒng),Spark生態(tài)系統(tǒng)如圖7-1所示。

Spark的設(shè)計遵循“一個軟件棧滿足不同應(yīng)用場景”的理念,逐漸形成了一套完整的生態(tài)系統(tǒng),Spark生態(tài)系統(tǒng)如圖7-1所示。圖7-1Spark生態(tài)系統(tǒng)7.1.3Spark運行架構(gòu)嵌入式系統(tǒng)基本概念

圖7-2Spark運行架構(gòu)7.2Scala基礎(chǔ)嵌入式系統(tǒng)基本概念由于Spark是由Scala語言編寫的,Scala語言是Spark編程的首選語言,為了后續(xù)更好地學(xué)習(xí)Spark,需要首先學(xué)習(xí)Scala語言。7.2.1Scala簡介嵌入式系統(tǒng)基本概念

Scala是一種將面向?qū)ο蠛秃瘮?shù)式編程結(jié)合在一起的高級語言,旨在以簡潔、優(yōu)雅和類型安全的方式表達通用編程模式。Spark支持使用Scala、Java、Python和R語言進行編程。Spark編程首選語言是Scala,因為Spark這個軟件本身就是使用Scala語言開發(fā)的,Scala具有強大的并發(fā)性,支持函數(shù)式編程,可以更好地支持分布式系統(tǒng),并且支持高效的交互式編程。采用Scala語言編寫Spark應(yīng)用程序,可以獲得很好的性能。7.2.1Scala簡介嵌入式系統(tǒng)基本概念

Scala是一種基于JVM的跨平臺編程語言,Scala編譯器可以將Scala源碼編譯成符合JVM虛擬機規(guī)范的中間字節(jié)碼文件,在JVM平臺上解釋和運行;Scala語言的API可無縫兼容Java的API。7.2.2Scala編程嵌入式系統(tǒng)基本概念

Scala中使用關(guān)鍵字val和var聲明變量。val類似Java中的final變量,也就是常量,一旦初始化將不能修改;var類似Java中的非final變量,可以被多次賦值,多次修改。Scala語言使用靈活,支持自動類型推測,非常簡潔高效。如定義一個初值為5的整型常量,下面兩種寫法是等效的:

vala=5

vala:Int=57.2.2Scala編程嵌入式系統(tǒng)基本概念【例7-1】從控制臺讀入數(shù)據(jù):使用readInt、readDouble、readLine輸入整數(shù)、實數(shù)、字符串,使用print、println輸出已讀入的數(shù)據(jù)。

scala>importio.StdIn._

scala>varx=readInt()

scala>vary=readDouble()

scala>varstr=readLine("pleaseinputyourname:")

scala>print(x)

scala>println(y)

scala>println(str)7.2.2Scala編程嵌入式系統(tǒng)基本概念

【例7-2】創(chuàng)建一個列表list1,包含10個元素,這10個元素是亂序的,然后這些元素進行以下操作并生成新的列表,list1保持不變:遍歷,排序,反轉(zhuǎn),求和(多種方法,包括用循環(huán)結(jié)構(gòu)),對所有元素乘2,對所有元素加1,過濾出只包含偶數(shù)的列表,拆分成大小為3的子列表。7.2.2Scala編程嵌入式系統(tǒng)基本概念

//創(chuàng)建一個列表list1

scala>vallist1=List(3,9,2,5,7,6,1,8,0,4)//遍歷

scala>list1.foreach(println)//排序

scala>vallist2=list1.sorted//反轉(zhuǎn)

scala>vallist3=list1.reverse7.2.2Scala編程嵌入式系統(tǒng)基本概念

//求和

vallist4=list1.sum//求和

scala>vallist5=list1.reduce(_+_)//用循環(huán)結(jié)構(gòu)求和

scala>varh=0for(i<-0tolist1.length-1)h=h+list1(i)

scala>println("h="+h)7.2.2Scala編程嵌入式系統(tǒng)基本概念//每個元素乘以2scala>vallist5=list1.map(_*2)//每個元素加1scala>vallist6=list1.map(_+1)//過濾出只包含偶數(shù)的列表scala>vallist7=list1.filter(x=>x%2==0)7.2.2Scala編程嵌入式系統(tǒng)基本概念

//拆分成大小為3的子列表

scala>val

ged=list1.grouped(3)

scala>ged.next

scala>ged.next

scala>ged.next

scala>ged.next7.4RDD編程基礎(chǔ)嵌入式系統(tǒng)基本概念

RDD(ResilientDistributedDataset),彈性分布式數(shù)據(jù)集,是分布式內(nèi)存的一個抽象概念,RDD提供了一種高度受限的共享內(nèi)存模型,即RDD是只讀的記錄分區(qū)的集合。RDD是Spark的核心概念。7.4.1SparkShell的啟動和退出嵌入式系統(tǒng)基本概念

圖7-17SparkShell成功啟動后的界面7.4.2RDD創(chuàng)建嵌入式系統(tǒng)基本概念

1.從對象集合創(chuàng)建RDDSpark可以調(diào)用SparkContext的parallelize(),以一個已經(jīng)存在的集合(列表)為數(shù)據(jù)源,創(chuàng)建RDD。例如,通過一個List列表創(chuàng)建RDD,命令如圖7-18所示。圖7-18parallelize創(chuàng)建RDD7.4.2RDD創(chuàng)建嵌入式系統(tǒng)基本概念

2.從外部存儲創(chuàng)建RDDSpark的textFile()方法可以從文件系統(tǒng)中加載數(shù)據(jù)創(chuàng)建RDD,下面演示從HDFS和Linux本地加載數(shù)據(jù)創(chuàng)建RDD。(1)從HDFS中加載數(shù)據(jù)例如,在HDFS上有一個文件“/test2/f1.txt”,讀取該文件創(chuàng)建一個RDD,命令如圖7-19所示。圖7-19從HDFS中加載數(shù)據(jù)7.4.2RDD創(chuàng)建嵌入式系統(tǒng)基本概念

(2)從Linux本地加載數(shù)據(jù)例如,在Linux本地有一個文件“/user/data/f2.txt”,讀取該文件創(chuàng)建一個RDD,命令如圖7-20所示。圖7-20從Linux本地加載數(shù)據(jù)7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念RDD的操作分為行動操作(Action)和轉(zhuǎn)換操作(Transformation)。1.行動操作Spark程序執(zhí)行到行動操作時,才會從文件中加載數(shù)據(jù),完成一次又一次轉(zhuǎn)換操作,最后完成行動操作。由于轉(zhuǎn)換操作需要行動操作才能查看命令執(zhí)行的結(jié)果,所以先介紹行動操作。7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念

(1)count()返回RDD中的元素個數(shù)(2)collect()以數(shù)組的形式返回數(shù)據(jù)集中的所有元素(3)first()返回數(shù)據(jù)集中的第一個元素(4)take(n)返回一個數(shù)組,數(shù)組元素由數(shù)據(jù)集的前n個元素組成(5)reduce(func)通過函數(shù)func聚合數(shù)據(jù)集中的元素(6)foreach(func)對RDD中的每一個元素運行給定的函數(shù)func7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念例如,統(tǒng)計rdd1中的元素個數(shù),以數(shù)組的形式返回rdd1的所有元素,取rdd1的第一個元素,取rdd1的前3個元素,求rdd1中所有元素之和,輸出rdd1的所有元素,代碼及執(zhí)行結(jié)果如圖7-21所示。RDD的操作如果沒有參數(shù),后面的括號是可以省略的。7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念

圖7-21RDD的行動操作7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念2.轉(zhuǎn)換操作對于RDD而言,每一次轉(zhuǎn)換操作都會產(chǎn)生新的RDD,供給下一個“轉(zhuǎn)換”使用。轉(zhuǎn)換操作是惰性操作,整個轉(zhuǎn)換過程只是記錄了轉(zhuǎn)換的軌跡,并不會發(fā)生真正的計算,只有遇到行動操作時,才會觸發(fā)“從頭到尾”的真正的計算。7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念

(1)filter(func)例如,過濾出rdd1中大于3的元素,并輸出結(jié)果,可用兩種方法實現(xiàn),代碼及執(zhí)行結(jié)果如圖7-22所示。7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念圖7-22過濾出rdd1中大于3的元素7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念

(2)map(func)例如,將rdd1中每一個元素加5,并輸出結(jié)果,代碼及執(zhí)行結(jié)果如圖7-23所示。圖7-23將rdd1中每一個元素加57.4.3常用的RDD操作嵌入式系統(tǒng)基本概念

(3)flatMap(func)

flatMap(func)操作是將RDD中的每一個元素傳遞到函數(shù)func中,將返回的迭代器(數(shù)組、列表)中的所有元素構(gòu)成新的RDD。例如,用map(func)和flatMap(func)分割字符串,代碼及執(zhí)行結(jié)果如圖7-24所示。7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念

圖7-24用map(func)和flatMap(func)分割字符串7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念(4)groupByKey()groupByKey()應(yīng)用于(key,value)鍵值對的RDD,可以將相同key的元素聚集到一起,返回一個新的(key,Iterable)形式的RDD。例如,有兩位員工zhangsan和lisi,zhangsan的工資和獎金分別為5000元、1500元,lisi的工資和獎金分別為6000元、2000元,統(tǒng)計zhangsan和lisi的總收入,代碼及執(zhí)行結(jié)果如圖7-25所示。7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念

圖7-25groupByKey()示例7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念(5)reduceByKey(func)

reduceByKey(func)應(yīng)用于(key,value)鍵值對的RDD時,返回一個新的(key,value)形式的RDD,其中的每個值是將每個key傳遞到函數(shù)func中進行聚合后得到的結(jié)果。用reduceByKey(func)重做上例,代碼及執(zhí)行結(jié)果如圖7-26所示。7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念圖7-26reduceByKey(func)示例7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念

(6)sortBy()

sortBy()將RDD中的元素按照某一字段進行排序,其中第一個參數(shù)為排序字段,第二個參數(shù)是一個布爾值,指定升序(默認)或降序。若第二個參數(shù)是false則為降序排列。例如,列表中存放了一些(key,value)鍵值對,用該列表創(chuàng)建RDD,然后對該RDD中的元素按照第二個字段降序排列,代碼及執(zhí)行結(jié)果如圖7-27所示。7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念圖7-27sortBy()示例7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念

(7)union()union()的參數(shù)是RDD,它將兩個RDD合并為一個新的RDD,兩個RDD中的數(shù)據(jù)類型要保持一致。例如,創(chuàng)建兩個RDD,并將這兩個RDD合并成一個新的RDD,代碼及執(zhí)行結(jié)果如圖7-28所示。7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念

圖7-28union()示例7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念

(8)mapValues(func)

mapValues(func)對鍵值對RDD中的每個value都應(yīng)用函數(shù)func,但是key不會發(fā)生變化。例如,將鍵值對RDD中的每個value加2,代碼及執(zhí)行結(jié)果如圖7-29所示。7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念

圖7-29mapValues(func)示例7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念

(9)keys鍵值對RDD中的每個元素都是(key,value)形式,keys操作只會把鍵值對RDD中的key返回,形成一個新的RDD。(10)values鍵值對RDD中的每個元素都是(key,value)形式,values操作只會把鍵值對RDD中的value返回,形成一個新的RDD。例如,分別輸出鍵值對RDD中的每個元素的鍵和值,代碼及執(zhí)行結(jié)果如圖7-30所示。7.4.3常用的RDD操作嵌入式系統(tǒng)基本概念

圖7-30keys和values示例7.4.4RDD編程實例嵌入式系統(tǒng)基本概念

【例7-3】假設(shè)在HDFS的/test2目錄下,有多個文本文件,每個文件存儲多個英文單詞,單詞之間用空格分隔。請統(tǒng)計每個單詞出現(xiàn)的次數(shù)。7.4.4RDD編程實例嵌入式系統(tǒng)基本概念

scala>vallines=sc.textFile("/test2")

scala>val

rddfalt=lines.flatMap(x=>x.split(""))

scala>val

wordCount=rddfalt.map(x=>(x,1)).reduceByKey((a,b)=>a+b)

scala>wordCount.collect()

scala>wordCount.foreach(println)7.4.4RDD編程實例嵌入式系統(tǒng)基本概念

【例7-4】hadoop.txt和spark.txt分別存儲了同一個班的《Hadoop基礎(chǔ)》和《Spark編程基礎(chǔ)》成績,其中第1列表示學(xué)號,第2列表示成績。請在SparkShell中通過編程來完成以下操作:7.4.4RDD編程實例嵌入式系統(tǒng)基本概念

1.從本地文件系統(tǒng)中加載hadoop.txt

scala>valhadoop1=sc.textFile("file:///home/shxx/data/hadoop.txt")2.從本地文件系統(tǒng)中加載spark.txt

scala>valspark1=sc.textFile("file:///home/shxx/data/spark.txt")7.4.4RDD編程實例嵌入式系統(tǒng)基本概念

3.查詢學(xué)生spark成績中的前3名使用map轉(zhuǎn)換數(shù)據(jù),每條數(shù)據(jù)被分割成2列,表示學(xué)號和成績,分隔符為“,”,存儲為二元組格式,成績要求轉(zhuǎn)化為Int類型。

scala>val

m_spark=spark1.map{x=>valline=x.split(",");(line(0),line(1).trim.toInt)}通過sortBy對元組中的成績列降序排序

scala>val

sort_spark=m_spark.sortBy(x=>x._2,false)通過take()操作取出每個RDD的前3個值

scala>sort_spark.take(3).foreach(println)7.4.4RDD編程實例嵌入式系統(tǒng)基本概念4.查詢spark成績90分以上的學(xué)生scala>val

filter_spark=m_spark.filter(x=>x._2>90)scala>filter_spark.foreach(println)5.查詢spark成績的最高分和最低分scala>val

max_spark=m_spark.values.maxscala>val

min_spark=m_spark.values.min7.4.4RDD編程實例嵌入式系統(tǒng)基本概念6.求spark課程的平均成績scala>valp1_spark=m_spark.values.map(x=>(x,1.0)).reduce((x,y)=>(x._1+y._1,x._2+y._2))scala>valp2_spark=p1_spark._1/p1_spark._27.4.4RDD編程實例嵌入式系統(tǒng)基本概念7.輸出每位學(xué)生所有科目的總成績scala>valm_hadoop=hadoop1.map{x=>valline=x.split(",");(line(0),line(1).trim.toInt)}scala>valunion_hs=m_spark.union(m_hadoop)scala>valall_score=union_hs.reduceByKey((a,b)=>a+b)scala>all_score.foreach(println)7.4.4RDD編程實例嵌入式系統(tǒng)基本概念

8.輸出每位學(xué)生的平均成績

scala>val

pj_score=all_score.mapValues(x=>x/2.0)

scala>pj_score.foreach(println)7.5IDEA的安裝和使用嵌入式系統(tǒng)基本概念I(lǐng)DEA全稱IntelliJIDEA,是一個通用的集成開發(fā)環(huán)境,IntelliJIDEA在業(yè)界被公認為最好的scala和java開發(fā)工具之一。我們可以使用IDEA開發(fā)Spark獨立應(yīng)用程序,7.5.2IDEA的使用嵌入式系統(tǒng)基本概念在$SPARK_HOME/examples/src/main/scala/org/apache/spark/examples目錄下,Spark自帶了名為“SparkPi”的例子程序,該例子采用分布式估算的方法求圓周率。計算原理為:假設(shè)有一個正方形,邊長是x,該正方形里面有一個內(nèi)切圓,可以算出正方形的面積S等于x2,內(nèi)切圓的面積C等于Pi×(x/2)2,于是就有Pi=4×C/S??梢岳糜嬎銠C隨機產(chǎn)生大量位于正方形內(nèi)部的點,通過點的數(shù)量去近似表示面積。假設(shè)位于正方形中點的數(shù)量為Ps,落在圓內(nèi)的點的數(shù)量為Pc,則當(dāng)隨機點的數(shù)量趨近于無窮時,4×Pc/Ps將逼近于Pi。7.5.2IDEA的使用嵌入式系統(tǒng)基本概念importscala.math.randomimportorg.apache.spark.sql.SparkSession/**Computesanapproximationtopi*/objectSparkPi{defmain(args:Array[String]):Unit={

valspark=SparkSession.builder.appName("SparkPi")/**如果在IDEA本地上運行需要加上.master("local"),如果要提交到Spark集群一定不能加.master("local")*/.master("local").getOrCreate()7.5.2IDEA的使用

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論