大數(shù)據(jù)分析及應用項目教程(Spark SQL)(微課版) 課件 許慧 第3、4章 學生信息處理分析、房產(chǎn)大數(shù)據(jù)分析與探索_第1頁
大數(shù)據(jù)分析及應用項目教程(Spark SQL)(微課版) 課件 許慧 第3、4章 學生信息處理分析、房產(chǎn)大數(shù)據(jù)分析與探索_第2頁
大數(shù)據(jù)分析及應用項目教程(Spark SQL)(微課版) 課件 許慧 第3、4章 學生信息處理分析、房產(chǎn)大數(shù)據(jù)分析與探索_第3頁
大數(shù)據(jù)分析及應用項目教程(Spark SQL)(微課版) 課件 許慧 第3、4章 學生信息處理分析、房產(chǎn)大數(shù)據(jù)分析與探索_第4頁
大數(shù)據(jù)分析及應用項目教程(Spark SQL)(微課版) 課件 許慧 第3、4章 學生信息處理分析、房產(chǎn)大數(shù)據(jù)分析與探索_第5頁
已閱讀5頁,還剩89頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章學生信息處理分析班級基本情況分析第一部分學生所屬班級和男女生數(shù)量以班級為單位整理學生信息情境導入

現(xiàn)有一份某校信息工程學院所有班級學生的基本情況數(shù)據(jù),如下圖所示。數(shù)據(jù)包含8個字段,分別為學號、姓名、性別、年級、班級、語文成績、數(shù)學成績、英語成績。當下輔導員想通過一位學生的學號獲知其所屬的班級,同時也想對各班級基本情況進行了解,以便后續(xù)的工作開展。學習目標和要求掌握Scala判斷與循環(huán)、函數(shù)式編程。掌握Scala集合操作。掌握Scala數(shù)據(jù)類型、常量與變量、運算符、數(shù)組。學生所屬班級和男女生數(shù)量——理論基礎(chǔ)1、數(shù)據(jù)類型數(shù)據(jù)類型類型描述Byte表示8位有符號補碼整數(shù)。其數(shù)值區(qū)間從-128到127。Short表示16位有符號補碼整數(shù)。其數(shù)值區(qū)間為-32768到32767。Int表示32位有符號補碼整數(shù)。其數(shù)值區(qū)間為-2147483648到2147483647。表示只能保存整數(shù)。Long表示64位有符號補碼整數(shù)。其數(shù)值區(qū)間為-9223372036854775808到9223372036854775807。Float表示32位IEEE754標準的單精度浮點數(shù)。如果浮點數(shù)后面有f或者F后綴時,表示這是一個Float類型,否則就是一個Double類型的。Double表示64位IEEE754標準的雙精度浮點數(shù)。Char表示16位無符號Unicode字符,區(qū)間值為U+0000到U+FFFF。String表示字符序列。即字符串,使用時需要使用雙引號包含一系列字符。Boolean其值為true或false。Unit表示無值,和其他語言中void等同。用于不返回任何結(jié)果的方法的結(jié)果類型。Unit只有一個實例值,寫成()。Nullnull或空引用NothingNothing類型在Scala的類層級的最底端,是任何其他類型的子類型。AnyAny是所有其他類的超類。AnyRefAnyRef類是Scala里所有引用類(referenceclass)的基類。Scala與Java的數(shù)據(jù)類型相同,但是Scala中的數(shù)據(jù)類型都是對象即Scala沒有java中的原生類型。因此Scala可以對數(shù)字等基礎(chǔ)類型調(diào)用方法。學生所屬班級和男女生數(shù)量——理論基礎(chǔ)2、常量與變量1)定義方法在Scala中,定義常量的關(guān)鍵字是“val”,語法格式如下:

val常量名稱:數(shù)據(jù)類型=初始值val一經(jīng)初始化就無法再進行修改,否則會報錯。在Scala中,定義變量的關(guān)鍵字是“var”,語法格式如下:

var變量名稱:數(shù)據(jù)類型=初始值學生所屬班級和男女生數(shù)量——理論基礎(chǔ)2)數(shù)據(jù)類型推斷

Scala具備數(shù)據(jù)類型推斷的功能,因此在定義常量或者變量時,可以不用特地說明數(shù)據(jù)的類型,即可以不在常量或變量名稱后面添加“:type”數(shù)據(jù)類型項。3)多變量聲明學生所屬班級和男女生數(shù)量——理論基礎(chǔ)A.若聲明的多個變量初始值相同,則只需用逗號分隔:B.若聲明的多個變量初始值不相同,則需將它們聲明為元組:3、運算符運算符類別運算符描述舉例算數(shù)運算符舉例中假設a=1,b=2算數(shù)運算符

+加號a+b運算結(jié)果為3-減號a-b運算結(jié)果為-1*乘號a*b運算結(jié)果為2/除號b/a運算結(jié)果為2%取余b%a運算結(jié)果為0Scala中運算符即方法、方法即運算符。學生所屬班級和男女生數(shù)量——理論基礎(chǔ)學生所屬班級和男女生數(shù)量——理論基礎(chǔ)關(guān)系運算符舉例中假設a=1,b=2關(guān)系運算符==等于a==b運算結(jié)果為false>大于a>b運算結(jié)果為false<小于a<b運算結(jié)果為true>=大于等于a>=b運算結(jié)果為false<=小于等于a<=b運算結(jié)果為true!=不等于a!=b運算結(jié)果為true邏輯運算符舉例中假設變量a為1,b為0邏輯運算符&&與,當兩個條件均成立則為真,否則為假a&&b運算結(jié)果為false||或,當兩個條件有一個成立則為真,否則為假a||b運算結(jié)果為true!非,對當前條件取反!(a&&b)運算結(jié)果為true學生所屬班級和男女生數(shù)量——理論基礎(chǔ)位運算符舉例中假設a=00111100,b=00001101位運算符&按位與,數(shù)據(jù)按照二進制位進行運算,兩位均為1則結(jié)果為1,否則為0a&b的運算結(jié)果為00001100|按位或,數(shù)據(jù)按照二進制位進行運算,兩位有一個為1則結(jié)果為1a|b的運算結(jié)果為00111101^按位異或,數(shù)據(jù)按照二進制位進行運算,兩位不同時結(jié)果為1,相同時為0a^b的運算結(jié)果為00110001~按位取反,數(shù)據(jù)按照二進制位進行運算,是1則變?yōu)?,是0則變成1~a的運算結(jié)果為11000011<<數(shù)據(jù)按照二進制位進行運算,左移a<<2的運算結(jié)果為11110000>>數(shù)據(jù)按照二進制位進行運算,右移a>>2的運算結(jié)果為00001111>>>數(shù)據(jù)按照二進制位進行運算,無符號右移a>>>2的運算結(jié)果為00001111學生所屬班級和男女生數(shù)量——理論基礎(chǔ)賦值運算符=指定右邊操作結(jié)果賦值給左邊c=a+b將a+b的運算結(jié)果賦值給c+=左右兩側(cè)相加后賦值給左邊c+=a即c=c+a-=左右兩側(cè)相減后賦值給左邊c-=a即c=c-a*=左右兩側(cè)相乘后賦值給左邊c*=a即c=c*a/=左右兩側(cè)相除后賦值給左邊c/=a即c=c/a%=左右兩側(cè)求余后賦值給左邊c%=a即c=c%a<<=按位左移后再賦值給左邊c<<=a即c=c<<a>>=按位右移后再賦值給左邊c>>=a即c=c>>a&=按位與運算后賦值給左邊c&=a即c=c&a|=按位或運算后再賦值給左邊c|=a即c=c|a^=按位異或運算后再賦值給左邊c^=a即c=c^a學生所屬班級和男女生數(shù)量——理論基礎(chǔ)4、數(shù)組

在Scala語言中,提供了一種數(shù)據(jù)結(jié)構(gòu)叫作數(shù)組,數(shù)組是用于存儲相同類型變量的集合。數(shù)組分為定長數(shù)組(Array)和變長數(shù)組(ArrayBuffer)。1)聲明與定義方式使用new的完整形式,其語法如下:vararrname:Array[type]=newArray[type](size)使用new的簡寫形式,其語法如下:vararrname=newArray[type](size)使用定義并初始化的方式,其語法如下:vararrname=Array(element1,element2,element3)變長數(shù)組:定義與聲明方式與定長數(shù)組的相同,但是需要先導入importscala.collection.mutable.ArrayBuffer依賴包。定長數(shù)組:學生所屬班級和男女生數(shù)量——理論基礎(chǔ)2)基本操作方法

數(shù)組的基本操作方法:基本操作描述arr.sum對于Int數(shù)據(jù)類型的數(shù)組,返回數(shù)組各元素的和arr.max對于Int數(shù)據(jù)類型的數(shù)組,返回數(shù)組各元素的最大值arr.min對于Int數(shù)據(jù)類型的數(shù)組,返回數(shù)組各元素的最小值arr.length返回數(shù)組的長度arr.sorted.toBuffer對于Int數(shù)據(jù)類型的數(shù)組,返回數(shù)組各元素由小到大排序結(jié)果arr.reverse.toBuffer對于Int數(shù)據(jù)類型的數(shù)組,返回數(shù)組各元素倒序arr.contains(x)判斷數(shù)組中是否包含x元素arr.isEmpty判斷數(shù)組是否為空學生所屬班級和男女生數(shù)量——理論基礎(chǔ)5、判斷與循環(huán)Scala的判斷與循環(huán)語法與其他計算機語言一樣。if判斷可以對數(shù)據(jù)進行過濾判斷處理,while和for循環(huán)可以在某一條件下將某段代碼進行重復執(zhí)行。1)if判斷if判斷有三種形式,分別為if語句、if…else語句、if…elseif…else語句和if…else嵌套語句。2)循環(huán)在Scala語言中循環(huán)也有三種方式,分別為while循環(huán)、do...while循環(huán)和for循環(huán)。學生所屬班級和男女生數(shù)量——理論基礎(chǔ)6、函數(shù)式編程1)函數(shù)的定義和調(diào)用def函數(shù)名[參數(shù)列表]:[返回值類型]={

函數(shù)體return[表達式]}函數(shù)調(diào)用的方法如下:

函數(shù)名[參數(shù)列表]函數(shù)的定義方法:學生所屬班級和男女生數(shù)量——理論基礎(chǔ)2)匿名函數(shù)匿名函數(shù)是指不含函數(shù)名稱的函數(shù)。使用“=>”定義,“=>”的左邊為參數(shù)列表,“=>”右邊為函數(shù)體表達式。匿名函數(shù)雖然沒有函數(shù)名,但是可以將其賦值給一個常量或者變量,然后通過常量或者變量名進行函數(shù)調(diào)用。學生所屬班級和男女生數(shù)量——理論基礎(chǔ)3)高階函數(shù)

高階函數(shù)是指使用其他函數(shù)作為參數(shù),或者使用函數(shù)作為輸出結(jié)果的函數(shù)。舉例:使用其他函數(shù)作為參數(shù)的高階函數(shù)學生所屬班級和男女生數(shù)量——理論基礎(chǔ)舉例,使用函數(shù)作為輸出結(jié)果的高階函數(shù)學生所屬班級和男女生數(shù)量——理論基礎(chǔ)4)閉包閉包是一個函數(shù),是可以訪問一個函數(shù)里面局部變量的另外一個函數(shù)。定義一個函數(shù):valmore=2defaddmore=(x:Int)=>x+moreaddmore(3)定義addmore函數(shù)的過程就是“捕獲”其自由變量從而“閉合”該函數(shù)的動作。學生所屬班級和男女生數(shù)量——理論基礎(chǔ)5)函數(shù)柯里化

函數(shù)編程中,接受多個參數(shù)的函數(shù)都可以轉(zhuǎn)化為接受單個參數(shù)的函數(shù),這個轉(zhuǎn)化過程就是柯里化??吕锘旧硪灿玫搅碎]包。//未柯里化方式defmul(x:Int,y:Int)=x*ymul(2,2)//閉包方式defmulclosure(x:Int)=(y:Int)=>x*yprintln(mulclosure(3)(4))//函數(shù)柯里化方式defmulcurry(x:Int)(y:Int)=x*yprintln(mulcurry(5)(6))學生所屬班級和男女生數(shù)量——理論基礎(chǔ)6)嵌套函數(shù)嵌套函數(shù)即在函數(shù)內(nèi)部定義函數(shù),其中內(nèi)部函數(shù)稱為局部函數(shù)。學生所屬班級和男女生數(shù)量——編程分析實現(xiàn)1、判斷學生所屬班級

完成此任務首先需要用數(shù)組存儲各個班級學生的學號,然后定義函數(shù)識別某個學生的學號獲取其所屬班級。1)定義班級數(shù)組2)定義distinguish函數(shù),利用if…elseif…else語句進行判斷識別學號。2、統(tǒng)計男女生人數(shù)信息

定義函數(shù)count(sex:String)統(tǒng)計男女生人數(shù)。在count(sex:String)函數(shù)中利用數(shù)組存儲數(shù)據(jù)信息,通過for循環(huán)遍歷數(shù)組并利用if判斷數(shù)組中元素是否包含指定性別,并進行sum計數(shù)。以班級為單位整理學生信息——理論基礎(chǔ)1、列表Scala列表與數(shù)組類似,所有元素的類型都相同。它們的區(qū)別首先是列表是不可變的,其次列表具有遞歸的結(jié)構(gòu)而數(shù)組不是。1)定義列表定義不可變列表語法://創(chuàng)建一個包含值1,值2,值3,值...的不可變列表var/val變量名:List[元素類型]=List[元素類型](值1,值2,值3,值...)//使用“::”拼接方式來創(chuàng)建列表,必須在最后添加一個Nilval/var變量名=值1::值2::Nil以班級為單位整理學生信息——理論基礎(chǔ)//導入相關(guān)依賴包importscala.collection.mutable.ListBuffer//創(chuàng)建一個空的可變列表val/var變量名:ListBuffer[類型]=newListBuffer[類型]()//創(chuàng)建一個包含值1,值2,值3...的可變列表val/var變量名=ListBuffer(值1,值2,值3...)定義可變列表語法:以班級為單位整理學生信息——理論基礎(chǔ)2)列表的常用操作以下是可變和不可變列表的常用操作。方法(對列表a和b進行操作)描述a.isEmpty判斷列表是否為空a++b拼接兩個列表a.head獲取列表的首個元素a.tail獲取列表除首個元素以外的剩余部分a.reverse反轉(zhuǎn)列表a.take(num)獲取指定個數(shù)的前綴a.drop(num)刪除從左邊開始的num個元素a.toString轉(zhuǎn)換字符串a(chǎn).toArray將列表轉(zhuǎn)換為數(shù)組List.concat(a,b)合并兩個列表ersect(b)對兩個列表取交集a.diff(b)對兩個列表取差集a(索引值)獲取列表中指定索引值的元素以班級為單位整理學生信息——理論基礎(chǔ)可變列表的常用操作方法(對列表a和b進行操作)描述a+=元素為列表添加元素a++=b追加一個列表a-=元素刪除列表中的元素a.toList將可變列表轉(zhuǎn)換為不可變列表

雖然可變和不可變列表都有添加、刪除、合并等操作,但是兩者有一個非常大的差別。對不可變列表進行操作,會產(chǎn)生一個新的列表,原來的列表并沒有改變。對可變列表進行操作,改變的是該列表本身。2、Set集合以班級為單位整理學生信息——理論基礎(chǔ)Set是無序,不可重復的集合。Set集合分為可變的和不可變的。Scala默認創(chuàng)建的是不可變的Set集合,若要創(chuàng)建可變的Set集合,需要先導入依賴包。1)定義Set集合

val

變量名:Set[類型]=Set[類型](值1,值2,值3...)舉例:vala=Set(9,2,5,4,8)以班級為單位整理學生信息——理論基礎(chǔ)可變和不可變Set集合的常用操作方法方法(對Set集合a或b進行操作)描述a.drop(num)刪除從左邊開始的num個元素a.contains(元素)判斷集合是否包含此元素a.size集合的大小a++b合并Set集合2)Set的基本操作以班級為單位整理學生信息——理論基礎(chǔ)不可變Set集合的添加/刪除操作方法方法(對不可變Set集合a和b進行操作)描述a+元素添加元素a-元素刪除元素可變Set集合的添加/刪除操作方法方法(對可變Set集合a和b進行操作)描述b.add(元素)添加元素b.remove(元素)刪除元素b+=元素添加元素b-=元素刪除元素a++=b元素合并Set集合3、元組以班級為單位整理學生信息——理論基礎(chǔ)

元組是不同類型值的聚集,它可以將不同類型的值放在一個變量中進行存儲。定義元組的語法一:valtuple=(元素1,元素2,元素3…)定義元組的語法二:valt=newTuplen(元素1,元素2,元素3...元素n)

當需要訪問元組中的某個元素的值時,可以通過“元組名_元素索引”進行訪問。4、Map映射以班級為單位整理學生信息——理論基礎(chǔ)1)映射定義:

映射是一系列鍵值對的集合。映射中的鍵都是唯一的,并且可以通過鍵獲取值。可變映射的定義需要先導入相關(guān)依賴包。2)映射的常用操作:方法(對映射a和b進行操作)描述a.keys獲取所有的keya.values獲取所有的valuea(key)使用key獲取value,如果key不存在會報錯a.contains(key)查看Map中是否存在指定的keya.isEmpty檢查map是否為空a++b合并兩個map,如果key重復,++后者會替換掉前邊的key對應的value5、函數(shù)組合器以班級為單位整理學生信息——理論基礎(chǔ)

函數(shù)組合器在實際操作中非常實用。組合器包括map、filter、foreach、groupBy、flatten、drop、zip等。組合器可以對集合中的每個元素進行指定的操作,并將結(jié)果形成集合輸出。組合器描述map將某個函數(shù)應用到中的每個元素,并將結(jié)果形成集合輸出。filter指定條件,對集合中的元素進行過濾foreach對集合中的每個元素進行作用,但是沒有返回值。groupBy對集合中的元素進行分組操作,得到一個Map。flatten可以把嵌套的結(jié)構(gòu)展開。drop去掉集合前面的n個元素zip將兩個集合結(jié)合在一起以班級為單位整理學生信息——編程分析實現(xiàn)

以班級為單位整理學生信息,可以先將數(shù)據(jù)保存到列表中,然后使用groupBy組合器以班級為條件進行分組。1)在scala命令輸入行輸入以下命令,創(chuàng)建列表保存數(shù)據(jù)。valdata=List("21103,嚴林石,男,21級,大數(shù)據(jù)1班,89,97,91","21108,莊偉康,男,21級,大數(shù)據(jù)1班,67,94,87","21208,陳心雨,女,21級,大數(shù)據(jù)2班,84,92,91","21107,鄒和俊,男,21級,大數(shù)據(jù)1班,77,83,88")以班級為單位整理學生信息——編程分析實現(xiàn)2)接著應用groupBy組合器進行分組,分組條件是班級。因此需要選取班級列進行操作,使用“,”對列表中每條數(shù)據(jù)進行split分隔,班級數(shù)據(jù)是在第4列。由此實現(xiàn)了以班級為單位整理學生信息。學生基本情況獲取第二部分學生特長情況學生成績情況分析情境導入

在掌握了前一節(jié)中Scala的基本知識后,李雷同學提出了新的疑問。Scala作為一門純粹的面向?qū)ο蟮恼Z言它的類和對象又有什么特點?定義和使用方法又是如何的?通過接下來對Scala類和對象、模式匹配等知識的學習,能對學生特長情況與成績情況進行分析。學習目標和要求1、了解Scala類和對象、模式匹配的基本概念。2、掌握Scala類和對象、模式匹配的定義及操作方法。3、能綜合應用Scala基礎(chǔ)知識編寫應用程序進行數(shù)據(jù)分析。1、類和對象學生特長情況——理論基礎(chǔ)

類和對象是Scala面向?qū)ο笳Z言的兩個重要概念。類是對象的抽象,而對象是類的具體實例。類的定義方式如下:Class類名稱(參數(shù)列表){//定義類的字段和方法}

繼承是面向?qū)ο箝_發(fā)語言中的一個概念,繼承可以使得子類具有父類的屬性和方法或者重新定義、追加屬性和方法等??梢允沟米宇悇e具有父類別的各種屬性和方法,而不需要再次編寫相同的代碼,可以有效復用代碼。但是Scala是單繼承,只能繼承一個父類。繼承類需要用到關(guān)鍵字extends。學生特長情況——理論基礎(chǔ)繼承的語法如下:class子類名extends父類名{類體}注意:子類繼承父類中非抽象的方法(即已經(jīng)實現(xiàn)的方法)必須使用override修飾符。2、單例對象和伴生對象學生特長情況——理論基礎(chǔ)1)單例對象單例對象是一種特殊的類,有且只有一個實例。定義一個單例對象的語法如下:object單例對象名{}2)半生對象

若在同一個代碼文件內(nèi)部,同時出現(xiàn)了classA和objectA,即類名和單例對象名完全相同,那么它們兩者就互為伴生關(guān)系。3、模式匹配學生特長情況——理論基礎(chǔ)

模式匹配(patternmatching)是Scala中十分強大的一個語言特性。模式匹配基本語法如下所示:xmatch{ casepattern1=>doSomething casepattern2=>doothers...}學生特長情況——編程分析實現(xiàn)

學生特長情況數(shù)據(jù)speciality.txt包括三個字段,分別是學生學號、姓名、特長類別?,F(xiàn)要獲知某一類特長的學生情況,可以先定義一個object單例對象。在此對象中讀取數(shù)據(jù)文件,并轉(zhuǎn)換成數(shù)組。接著遍歷數(shù)組,搜索包括某類特長的學生數(shù)據(jù)并打印。思路分析:綜合案例——學生成績情況分析data.txt原始數(shù)據(jù)字段信息字段含義stuid學號name姓名sex性別grade年級class班級Chinese語文成績Math數(shù)學成績English英語成績

現(xiàn)要求使用Scala函數(shù)式編程,綜合本章前面所學知識,進行學生成績分析統(tǒng)計。獲得各門課程的平均成績和及格人數(shù)(大于60),每個同學所有課程的總成績。小結(jié)

本章詳細介紹Scala的一些基本知識、操作方法,包括函數(shù)、表達式、判斷與循環(huán)、數(shù)據(jù)結(jié)構(gòu)、類和對象等。并完成了“班級基本情況分析”和“學生基本情況獲取”。THANKS!第4章房產(chǎn)大數(shù)據(jù)分析與探索某房產(chǎn)公司銷售人員業(yè)績分析第一部分數(shù)據(jù)集處理數(shù)據(jù)操作分析情境導入

員工業(yè)績考核分析是企業(yè)工作總結(jié)的重要組成部分。從業(yè)績分析中員工可以清楚的知道自己的工作應該達到何種標準,發(fā)現(xiàn)自己的工作長處和不足,激發(fā)工作的積極性。管理者可以清楚的了解員工的工作情況,通過分析不足,幫助員工改進、提高業(yè)績,促進企業(yè)的發(fā)展進步。假設現(xiàn)有某房產(chǎn)公司一個部門員工的某年銷售業(yè)績數(shù)據(jù),請幫助部門經(jīng)理對其進行統(tǒng)計分析,獲取相關(guān)信息。學習目標和要求1、掌握將數(shù)據(jù)構(gòu)建為RDD的方法。2、能使用RDD的各種轉(zhuǎn)換和行動操作對數(shù)據(jù)集進行處理分析。3、會對處理完成的數(shù)據(jù)進行存儲操作。數(shù)據(jù)集處理

在Spark中最核心最基礎(chǔ)的概念是彈性分布式數(shù)據(jù)集(ResilientDistributedDatasets,RDD)。它是一種分布式的內(nèi)存抽象,可以基于任何數(shù)據(jù)結(jié)構(gòu)進行創(chuàng)建。

創(chuàng)建RDD的方法有兩種,一種是基于內(nèi)存(集合)創(chuàng)建RDD,另一種是從外部數(shù)據(jù)集創(chuàng)建。1、基于內(nèi)存(集合)創(chuàng)建RDD。

從集合中創(chuàng)建RDD,主要提供了兩個方法:使用SparkContext類中的parallelize和makeRDD兩個方法。數(shù)據(jù)集處理(1)parallelize方法創(chuàng)建RDD

此方法有兩個參數(shù)可以輸入,第一個參數(shù)用來接收一個集合。第二個參數(shù)是可選的,用于指定創(chuàng)建的RDD的分區(qū)數(shù)。(2)makeRDD方法創(chuàng)建RDDmakeRDD方法和parallelize方法類似,但它可以指定每個分區(qū)的首選位置。數(shù)據(jù)集處理2、從外部存儲數(shù)據(jù)構(gòu)造RDD數(shù)據(jù)集處理

讀取一個放在文件系統(tǒng)中的數(shù)據(jù)進行創(chuàng)建RDD。從本地文件創(chuàng)建,主要用于測試;使用HDFS文件獲取外部數(shù)據(jù)集創(chuàng)建,實踐操作中最常用。通過調(diào)用SparkContext的textFile方法讀取數(shù)據(jù)集。調(diào)用命令如下:textFile("/my/directory")textFile("/my/directory/*.txt")textFile("/my/directory/*.gz")(1)加載HDFS上存儲的CSV文件構(gòu)造一個RDD數(shù)據(jù)集處理

從HDFS中的數(shù)據(jù)創(chuàng)建RDD,首先需要定義文件在HDFS上存儲的路徑,然后根據(jù)路徑使用sc.textFile()方法進行創(chuàng)建。//定義HDFS上test.csv文件的存儲路徑valHDFSfile="/Chapter4/test.csv"

//使用textFile方法,加載文件并構(gòu)造RDDvalHDFSrdd=sc.textFile(HDFSfile)

//查看返回值HDFSrdd.collect()(2)加載本地Linux中的文件構(gòu)造一個RDD數(shù)據(jù)集處理

讀取本地Linux中的文件構(gòu)造RDD也是通過sc.textFile("path")的方法,在path路徑前面加上“file:///”表示從本地文件系統(tǒng)讀取數(shù)據(jù)。3、操作練習——構(gòu)建員工業(yè)績RDD數(shù)據(jù)集處理(1)上傳數(shù)據(jù)集到HDFS文件系統(tǒng)中。(2)從HDFS文件系統(tǒng)中讀取文件并創(chuàng)建RDD。數(shù)據(jù)操作分析1、RDD支持的兩種操作。(1)轉(zhuǎn)換操作:就是對RDD中的數(shù)據(jù)進行各種轉(zhuǎn)換。方法名稱作用map將RDD中的每一個數(shù)據(jù)元素通過func函數(shù)轉(zhuǎn)換,返回新的RDD。flatmap首先將map方法應用于RDD的所有元素,然后將結(jié)果扁平化拆分,返回一個新的RDD。sortby通過指定條件對RDD中的元素進行排序。filter通過指定條件對RDD中的元素進行過濾。distinct對RDD中的所有元素去重,返回一個去重后的RDD。union將兩個RDD進行合并,返回合并后的數(shù)據(jù)集。keys返回PairRDD中的“鍵”形成的新的RDD。values返回PairRDD中的“值”形成的新的RDD。reducebykey對“鍵”相同的值使用指定的函數(shù)進行聚合操作。groupbykey對“鍵”相同的值根據(jù)指定條件進行分組。sortbykey根據(jù)“鍵”對RDD內(nèi)部的元素進行排序。join根據(jù)“鍵”對兩個RDD進行連接。數(shù)據(jù)操作分析(2)行動操作:RDD的行動操作則是向驅(qū)動器程序返回結(jié)果或者把結(jié)果寫入外部系統(tǒng)的操作,會觸發(fā)實際的計算方法名稱作用count返回RDD中元素的個數(shù)。take返回RDD中前n個元素值。first返回RDD中第一個元素值。collect返回RDD中所有元素的列表。top返回RDD中排名前n的元素值。數(shù)據(jù)操作分析2、統(tǒng)計部門人員人數(shù)。count()行動操作,返回的是RDD內(nèi)元素的個數(shù)。舉例:利用序列Seq(1,2,3,4,5,6)創(chuàng)建的rdd中有6個數(shù)字元素操作練習:統(tǒng)計部門人員人數(shù)數(shù)據(jù)操作分析3、分別統(tǒng)計上/下半年業(yè)績排名,取前三位及最后三位利用map、flatmap、sortby、take,first、collect等方法對數(shù)據(jù)進行操作實現(xiàn)。(1)map轉(zhuǎn)換操作map轉(zhuǎn)換操作是最常用的轉(zhuǎn)換算子,對RDD中的每個元素都執(zhí)行一個指定的函數(shù)來產(chǎn)生一個新的RDD。舉例:數(shù)據(jù)操作分析(2)flatmap轉(zhuǎn)換操作

此方法首先將map函數(shù)應用于RDD的所有元素,然后將返回的結(jié)果平坦化。舉例:對map轉(zhuǎn)換操作中的str1進行flatmap轉(zhuǎn)換操作。

對比map和flatMap操作的輸出結(jié)果圖,可以很容易的看出兩者的區(qū)別,因此flatMap操作通常用來切分單詞。數(shù)據(jù)操作分析(3)sortby轉(zhuǎn)換操作此方法是對RDD進行排序,有3個參數(shù)可以輸入。 sortby(參數(shù)一,參數(shù)二,參數(shù)三)參數(shù)一是要進行排序的對象值;參數(shù)二是排序方式,默認是正序排序,使用false參數(shù)就是倒序排序;參數(shù)三是分區(qū)個數(shù)。數(shù)據(jù)操作分析//加載一個RDD,命名為testvaltest=sc.parallelize(Array(("dog",3),("cat",1),("monkey",2),("pig",3),("bird",2)))//根據(jù)test中的第二位元素進行降序排序valtest_desc=test.sortBy(_._2,false)//查看結(jié)果test_desc.collect//根據(jù)test中的第二位元素進行升序排序valtest_asc=test.sortBy(_._2)//查看結(jié)果test_asc.collectsortby舉例:數(shù)據(jù)操作分析(4)take,first、collect行動操作take行動操作返回RDD的前n個元素值。first行動操作返回的是RDD中的第一個元素值。collect行動操作是以數(shù)組的形式將RDD中所有的元素返回。數(shù)據(jù)操作分析(5)進行分析,實現(xiàn)任務。1)按照前面的問題分析思路,首先對上半年和下半年的業(yè)績數(shù)據(jù)集firstrdd、secondrdd進行map轉(zhuǎn)換,將每行數(shù)據(jù)分割為4列。2)利用sortBy方法對map_firstrdd和map_secondrdd數(shù)據(jù)集中的業(yè)績列分別進行降序和升序排序,取出排名前三和后三的信息。對上半年業(yè)績列進行降序和升序排序: valsort_firstrdd=map_firstrdd.sortBy(x=>x._4,false) sort_firstrdd.take(3) valsort_firstrdd=map_firstrdd.sortBy(x=>x._4) sort_firstrdd.take(3)同理對下半年業(yè)績列進行降序和升序排序。數(shù)據(jù)操作分析4、統(tǒng)計上/下半年業(yè)績超過5000萬的人員。

要獲取這個問題的數(shù)據(jù),首先需要分別過濾出上下半年業(yè)績超過5000萬的人員。但是有些人員只有上半年或者下半年符合要求,有些人員是上下半年都符合要求,因此還需要對過濾出來的人員信息進行去重??梢岳胒ilter、distinct、union等方法對數(shù)據(jù)進行操作。(1)filter轉(zhuǎn)換操作此方法返回滿足指定過濾條件的元素,不滿足條件的元素被忽略。//讀取一個數(shù)字列表創(chuàng)建RDDvalrdd=sc.parallelize(List(1,3,6,2,8,8,5,6,7))//過濾出大于5的數(shù)字rdd.filter(x=>x>5).collect數(shù)據(jù)操作分析(2)distinct轉(zhuǎn)換操作

此方法是對RDD中的數(shù)據(jù)去重,把完全相同的元素去除。對前述filter轉(zhuǎn)換操作中的rdd數(shù)據(jù)進行操作。由輸出結(jié)果可見,原先列表中重復的數(shù)字6和8被去重了。數(shù)據(jù)操作分析(3)union轉(zhuǎn)換操作

此方法可以將兩個RDD進行合并,返回兩個RDD的并集,并且不去重。但是要求兩個RDD中每個元素中的值的個數(shù)及數(shù)據(jù)類型保持一致。//定義加載兩個RDD,命名為test1和test2valtest1=sc.parallelize(Array(("dog",3),("cat",1),("monkey",2)))valtest2=sc.parallelize(Array(("monkey",2),("pig",3),("bird",2)))//執(zhí)行union操作合并兩個RDDtest1.union(test2).collect數(shù)據(jù)操作分析(4)進行分析,實現(xiàn)任務。1)利用filter方法過濾出業(yè)績大于5000萬的人員,最終返回人員編號信息。2)利用union方法,將上述過濾后的數(shù)據(jù)集filter_firstrdd和filter_secondrdd進行合并,并通過distinct方法去除重復的人員編號信息。數(shù)據(jù)操作分析5、統(tǒng)計此部門當年的房屋銷售套數(shù)。

要獲取這個問題的數(shù)據(jù),只需取出數(shù)據(jù)表的第三列“房屋銷售套數(shù)”數(shù)據(jù),然后利用求和函數(shù)進行求和??梢岳肦DD的相關(guān)描述性統(tǒng)計函數(shù)實現(xiàn)。(1)min()、max()函數(shù)min()方法返回RDD中的最小值,max()方法返回RDD中的最大值。數(shù)據(jù)操作分析(2)mean()、sum()函數(shù)mean()函數(shù)返回RDD中的平均值。sum()函數(shù)返回RDD中的總和。舉例:求RDD數(shù)據(jù)集的平均值和總和。數(shù)據(jù)操作分析(3)variance()、stdev()函數(shù)variance()計算RDD中所有元素的總體方差。stdev()計算RDD的標準差。舉例:求RDD數(shù)據(jù)集的總體方差和樣本方差。數(shù)據(jù)操作分析(4)進行分析,實現(xiàn)任務。

將經(jīng)過map操作處理好的上/下半年業(yè)績數(shù)據(jù)集map_firstrdd和map_secondrdd進行合并,取出第三列數(shù)據(jù),利用sum函數(shù)計算總數(shù)。數(shù)據(jù)操作分析6、查看全年總業(yè)績最高人員。

此任務需要將每個人上、下半年的業(yè)績進行相加,然后取最高者。這個過程需要對人員編號相同的業(yè)績數(shù)據(jù)進行識別并相加。在RDD中可以通過鍵值對(Key-Value)的操作完成。Spark為包含鍵值對類型的RDD提供了一些專有的操作,這些RDD被稱為Pair

RDD。數(shù)據(jù)操作分析(1)創(chuàng)建PairRDD

創(chuàng)建PairRDD的方法有很多,當需要將一個普通RDD轉(zhuǎn)換為PairRDD時,可以使用map方法來實現(xiàn)。//定義一個RDDvalrdd=sc.parallelize(List("dog","cat","monkey","pig"))//創(chuàng)建鍵值對valpairrdd=rdd.map(word=>(word,1))(2)keys()、values()轉(zhuǎn)換操作keys()、values()操作返回的類型是RDD。//取pairrdd中的鍵pairrdd.keys.collect//取pairrdd中的值pairrdd.values.collect數(shù)據(jù)操作分析(3)reducebykey()轉(zhuǎn)換操作

此方法應用于鍵值對數(shù)據(jù)集操作,對Key相同的Value使用指定的函數(shù)進行聚合操作,返回一個鍵值對的數(shù)據(jù)集。reduceByKey((x,y)=>x+y),對PairRDD中鍵相同的值進行相加操作。數(shù)據(jù)操作分析(4)groupbykey()轉(zhuǎn)換操作

此方法會對相同鍵的值進行分組,形成二元元組,第一個字段為相同的鍵,第二個字段為具備相同鍵的值的集合。對前一個任務中的map_test數(shù)據(jù)集進行操作。 valgroup_test=map_test.groupByKey() group_test.collect數(shù)據(jù)操作分析(5)sortByKey()轉(zhuǎn)換操作此方法返回一個根據(jù)“鍵”進行排序的RDD。舉例:數(shù)據(jù)操作分析(6)進行分析,實現(xiàn)任務1)將上、下半年的的業(yè)績合并到同一個RDD中。valtotal=map_firstrdd.union(map_secondrdd)2)將數(shù)據(jù)轉(zhuǎn)換成(員工編號,業(yè)績)鍵值對,利用reduceByKey方法對相同員工編號對應的業(yè)績值進行相加。數(shù)據(jù)操作分析3)對業(yè)績總和進行排序,獲得最高業(yè)績?nèi)藛T信息。//利用sortBy方法對指定列進行排序 yeji.sortBy(x=>x._2,false) yeji.sortBy(x=>x._2,false).take(1)數(shù)據(jù)操作分析7、存儲以上統(tǒng)計分析信息

數(shù)據(jù)存儲的方式有多種,比如將數(shù)據(jù)存儲為JSON文件、CSV文件、文本文件等。文本文件的存儲可以直接調(diào)用saveAsTextFile(path)進行存儲。

對上、下半年的業(yè)績以及全年總業(yè)績數(shù)據(jù)進行join連接,再將結(jié)果數(shù)據(jù)以文本文件的形式存儲到HDFS中。操作練習:某城市近年房產(chǎn)銷售狀況分析第二部分數(shù)據(jù)準備數(shù)據(jù)探索與分析情境導入

房子是一個價格昂貴的“商品”,但也是每個人生活必不可少的一件“商品”。房子的價格、所處的位置、裝修情況等等因素都是購房者關(guān)心的主要問題。了解房產(chǎn)市場的變化規(guī)律以及各個因素對價格的影響,對于消費者來說是購房之前首先要做的功課。

現(xiàn)有一份來自某網(wǎng)站的某城市近年房產(chǎn)銷售數(shù)據(jù)集house-price.csv,包含成交時間、價格、裝修情況、區(qū)域等信息。學習目標和要求

能靈活綜合的

溫馨提示

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

評論

0/150

提交評論