




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Linux系統(tǒng)與大數(shù)據(jù)應(yīng)用10大數(shù)據(jù)應(yīng)用與案例第章本章內(nèi)容10.1Mahout數(shù)據(jù)挖掘10.2Hadoop應(yīng)用案例:Worldcount詞頻統(tǒng)計(jì)案例10.3Spark應(yīng)用案例:spark進(jìn)行電商數(shù)據(jù)檢索10.4本章小結(jié)10.1Mahout數(shù)據(jù)挖掘ApacheMahout是一個(gè)開(kāi)源項(xiàng)目,提供一些可擴(kuò)展的機(jī)器學(xué)習(xí)領(lǐng)域經(jīng)典算法的實(shí)現(xiàn),旨在幫助開(kāi)發(fā)人員更加方便快捷地創(chuàng)建智能應(yīng)用程序。經(jīng)典算法包括聚類、分類、協(xié)同過(guò)濾、進(jìn)化編程等等,并且,在Mahout的最近版本中還加入了對(duì)ApacheHadoop的支持,使這些算法可以更高效的運(yùn)行在云計(jì)算環(huán)境中。Mahout是一個(gè)很強(qiáng)大的數(shù)據(jù)挖掘工具,是一個(gè)分布式機(jī)器學(xué)習(xí)算法的集合,包括:被稱為Taste的分布式協(xié)同過(guò)濾的實(shí)現(xiàn)、分類、聚類等。Mahout最大的優(yōu)點(diǎn)就是基于hadoop實(shí)現(xiàn),把很多以前運(yùn)行于單機(jī)上的算法,轉(zhuǎn)化為了MapReduce模式,這樣大大提升了算法可處理的數(shù)據(jù)量和處理性能。一、Mahout安裝1、下載Mahout/dist/mahout/2、解壓(如圖10-1)tar-zxvfmahout-distribution-0.9.tar.gz10.1.1Mahout安裝和配置10.1.1Mahout安裝和配置圖10-1解壓3、配置環(huán)境變量(1)配置Mahout環(huán)境變量(如圖10-2)#setmahoutenvironmentexportMAHOUT_HOME=/user/mahoutexportMAHOUT_CONF_DIR=$MAHOUT_HOME/confexportPATH=$MAHOUT_HOME/conf:$MAHOUT_HOME/bin:$PATH圖10-2Mahout環(huán)境變量10.1.1Mahout安裝和配置(2)配置Mahout所需的Hadoop環(huán)境變量#sethadoopenvironmentexportHADOOP_HOME=/user/hadoopexportHADOOP_CONF_DIR=$HADOOP_HOME/confexportPATH=$PATH:$HADOOP_HOME/binexportHADOOP_HOME_WARN_SUPPRESS=not_null下圖10-3,是在實(shí)例中的環(huán)境配置:圖10-3Hadoop環(huán)境變量10.1.1Mahout安裝和配置4、驗(yàn)證運(yùn)行mahout,如果出現(xiàn)以下結(jié)果說(shuō)明配置正確。圖10-4驗(yàn)證10.1.1Mahout安裝和配置10.1.2KMeans算法和canopy算法一、kMeans算法KMEANS算法是輸入聚類個(gè)數(shù)k,以及包含n個(gè)數(shù)據(jù)對(duì)象的數(shù)據(jù)庫(kù),輸出滿足方差最小標(biāo)準(zhǔn)k個(gè)聚類的一種算法。k-means算法接受輸入量k;然后將n個(gè)數(shù)據(jù)對(duì)象劃分為k個(gè)聚類以便使得所獲得的聚類滿足:同一聚類中的對(duì)象相似度較高;而不同聚類中的對(duì)象相似度較小。1、處理流程(1)從n個(gè)數(shù)據(jù)對(duì)象任意選擇k個(gè)對(duì)象作為初始聚類中心;(2)根據(jù)每個(gè)聚類對(duì)象的均值(中心對(duì)象),計(jì)算每個(gè)對(duì)象與這些中心對(duì)象的距離;并根據(jù)最小距離重新對(duì)相應(yīng)對(duì)象進(jìn)行劃分;(3)重新計(jì)算每個(gè)(有變化)聚類的均值(中心對(duì)象);(4)計(jì)算標(biāo)準(zhǔn)測(cè)度函數(shù),當(dāng)滿足一定條件,如函數(shù)收斂時(shí),則算法終止;如果條件不滿足則回到步驟(2)。10.1.2KMeans算法和canopy算法1、實(shí)現(xiàn)方法k-means算法接受輸入量k;然后將n個(gè)數(shù)據(jù)對(duì)象劃分為k個(gè)聚類以便使得所獲得的聚類滿足:同一聚類中的對(duì)象相似度較高;而不同聚類中的對(duì)象相似度較小。聚類相似度是利用各聚類中對(duì)象的均值所獲得一個(gè)“中心對(duì)象”(引力中心)來(lái)進(jìn)行計(jì)算的。k-means算法的工作過(guò)程說(shuō)明如下:首先從n個(gè)數(shù)據(jù)對(duì)象任意選擇k個(gè)對(duì)象作為初始聚類中心;而對(duì)于所剩下其它對(duì)象,則根據(jù)它們與這些聚類中心的相似度(距離),分別將它們分配給與其最相似的(聚類中心所代表的)聚類;然后再計(jì)算每個(gè)所獲新聚類的聚類中心(該聚類中所有對(duì)象的均值);不斷重復(fù)這一過(guò)程直到標(biāo)準(zhǔn)測(cè)度函數(shù)開(kāi)始收斂為止。一般都采用均方差作為標(biāo)準(zhǔn)測(cè)度函數(shù).k個(gè)聚類具有以下特點(diǎn):各聚類本身盡可能的緊湊,而各聚類之間盡可能的分開(kāi)。算法的時(shí)間復(fù)雜度上界為O(n*k*t),其中t是迭代次數(shù)。10.1.2KMeans算法和canopy算法k-means算法是一種基于樣本間相似性度量的間接聚類方法,屬于非監(jiān)督學(xué)習(xí)方法。此算法以k為參數(shù),把n個(gè)對(duì)象分為k個(gè)簇,以使簇內(nèi)具有較高的相似度,而且簇間的相似度較低。相似度的計(jì)算根據(jù)一個(gè)簇中對(duì)象的平均值(被看作簇的重心)來(lái)進(jìn)行。此算法首先隨機(jī)選擇k個(gè)對(duì)象,每個(gè)對(duì)象代表一個(gè)聚類的質(zhì)心。對(duì)于其余的每一個(gè)對(duì)象,根據(jù)該對(duì)象與各聚類質(zhì)心之間的距離,把它分配到與之最相似的聚類中。然后,計(jì)算每個(gè)聚類的新質(zhì)心。重復(fù)上述過(guò)程,直到準(zhǔn)則函數(shù)收斂。k-means算法是一種較典型的逐點(diǎn)修改迭代的動(dòng)態(tài)聚類算法,其要點(diǎn)是以誤差平方和為準(zhǔn)則函數(shù)。逐點(diǎn)修改類中心:一個(gè)象元樣本按某一原則,歸屬于某一組類后,就要重新計(jì)算這個(gè)組類的均值,并且以新的均值作為凝聚中心點(diǎn)進(jìn)行下一次象元素聚類;逐批修改類中心:在全部象元樣本按某一組的類中心分類之后,再計(jì)算修改各類的均值,作為下一次分類的凝聚中心點(diǎn)。10.1.2KMeans算法和canopy算法openSUSE項(xiàng)目是由Novell發(fā)起的開(kāi)源社區(qū)計(jì)劃。旨在推進(jìn)Linux的廣泛使用,提供了自由簡(jiǎn)單的方法來(lái)獲得世界上最好用的Linux發(fā)行版之一openSUSE。openSUSE項(xiàng)目為L(zhǎng)inux開(kāi)發(fā)者和愛(ài)好者提供了開(kāi)始使用Linux所需要的一切。該項(xiàng)目由SUSE等公司贊助,2011年Attachmate集團(tuán)收購(gòu)了Novell,并把Novell和SUSE做為兩個(gè)獨(dú)立的子公司運(yùn)營(yíng)。openSUSE操作系統(tǒng)和相關(guān)的開(kāi)源程序會(huì)被SUSELinuxEnterprise(比如SLES和SLED)使用。openSUSE對(duì)個(gè)人來(lái)說(shuō)是完全免費(fèi)的,包括使用和在線更新。外文名稱:openSUSE發(fā)起人
:Novell目標(biāo)
:推進(jìn)Linux的廣泛使用類別
:開(kāi)源社區(qū)項(xiàng)目openSUSE是一個(gè)一般用途的基于Linux內(nèi)核的GNU/Linux操作系統(tǒng),由openSUSE項(xiàng)目社區(qū)開(kāi)發(fā)維護(hù),該項(xiàng)目由SUSE等公司贊助。在2004年2月Novell收購(gòu)SUSELinux之后,Novell決定以100%開(kāi)源產(chǎn)品發(fā)布SUSELinux專業(yè)版,并作為一個(gè)開(kāi)源項(xiàng)目,openSUSE繼承與SUSELinuxProfessional。2011年Attachmate集團(tuán)收購(gòu)了Novell,并把Novell和SUSE做為兩個(gè)獨(dú)立的子公司運(yùn)營(yíng)。SUSE提供基于openSUSE的企業(yè)級(jí)產(chǎn)品SUSELinuxEnterprise。openSUSE項(xiàng)目除了提供一個(gè)發(fā)行版,還包括一個(gè)OpenBuildService,openSUSE的目的是提供提供一個(gè)穩(wěn)定的基礎(chǔ)并讓用戶通過(guò)OpenBuildService得到額外的更多更新的軟件,甚至是一個(gè)滾動(dòng)發(fā)行的版本命為Tumbleweed。系統(tǒng)默認(rèn)KDE作為圖形環(huán)境,當(dāng)然GNOME也是很不錯(cuò)的,其他也有Xfce、LXDE等圖形環(huán)境。openSUSE是著名Novell公司旗下的Linux的發(fā)行版,發(fā)行量在歐洲占第一位。它采用的KDE4.3作為默認(rèn)桌面環(huán)境,同時(shí)也提供GNOME桌面版本。它的軟件包管理系統(tǒng)采用自主開(kāi)發(fā)的YaST,頗受好評(píng)。他的用戶界面非常華麗,甚至超越windows7,而且性能良好,最新版本是13.2。10.1.2KMeans算法和canopy算法二、canopy算法CanopyClustering這個(gè)算法是2000年提出來(lái)的,此后與Hadoop配合,已經(jīng)成為一個(gè)比較流行的算法了。確切的說(shuō),這個(gè)算法獲得的并不是最終結(jié)果,它是為其他算法服務(wù)的,比如k-means算法。它能有效地降低k-means算法中計(jì)算點(diǎn)之間距離的復(fù)雜度。Mahout中已經(jīng)實(shí)現(xiàn)了這個(gè)算法。首先為大家解釋一下canopy算法,下圖很好得展示了Canopy聚類的過(guò)程。(圖10-)圖10-5canopy算法聚類過(guò)程10.1.2KMeans算法和canopy算法圖中有一個(gè)T1,一個(gè)T2,我們稱之為距離閥值,顯然T1>T2,這兩個(gè)值有什么用呢?我們先確定了一個(gè)中心,然后計(jì)算其他點(diǎn)到這個(gè)中心間的距離,當(dāng)距離大于T1時(shí),小于T1大于T2時(shí),小于T2時(shí),對(duì)這個(gè)點(diǎn)的處理都是不一樣的。10.1.3貝葉斯算法學(xué)過(guò)概率理論的人都知道條件概率的公式:P(AB)=P(A)P(B|A)=P(B)P(A|B);即事件A和事件B同時(shí)發(fā)生的概率等于在發(fā)生A的條件下B發(fā)生的概率乘以A的概率。由條件概率公式推導(dǎo)出貝葉斯公式:P(B|A)=P(A|B)P(B)/P(A);即,已知P(A|B),P(A)和P(B)可以計(jì)算出P(B|A)。假設(shè)B是由相互獨(dú)立的事件組成的概率空間{B1,b2,...bn}。則P(A)可以用全概率公式展開(kāi):P(A)=P(A|B1)P(B1)+P(A|B2)P(B2)+..P(A|Bn)P(Bn)。貝葉斯公式表示成:P(Bi|A)=P(A|Bi)P(Bi)/(P(A|B1)P(B1)+P(A|B2)P(B2)+..P(A|Bn)P(Bn));常常把P(Bi|A)稱作后驗(yàn)概率,而P(A|Bn)P(Bn)為先驗(yàn)概率。而P(Bi)又叫做基礎(chǔ)概率。貝葉斯公式:圖10-6貝葉斯公式10.1.3貝葉斯算法貝葉斯公式看起來(lái)很簡(jiǎn)單,但是在自然科學(xué)領(lǐng)域應(yīng)用范圍及其廣泛。同時(shí)理論本身蘊(yùn)含了深刻的思想。一.貝葉斯概率的歷史貝葉斯理論和貝葉斯概率以托馬斯?貝葉斯(1702-1761)命名,他證明了現(xiàn)在稱為貝葉斯定理的一個(gè)特例。術(shù)語(yǔ)貝葉斯卻是在1950年左右開(kāi)始使用,很難說(shuō)貝葉斯本人是否會(huì)支持這個(gè)以他命名的概率非常廣義的解釋。拉普拉斯證明了貝葉斯定理的一個(gè)更普遍的版本,并將之用于解決天體力學(xué)、醫(yī)學(xué)統(tǒng)計(jì)中的問(wèn)題,在有些情況下,甚至用于法理學(xué)。但是拉普拉斯并不認(rèn)為該定理對(duì)于概率論很重要。他還是堅(jiān)持使用了概率的經(jīng)典解釋。弗蘭克?普倫普頓?拉姆齊在《數(shù)學(xué)基礎(chǔ)》(1931年)中首次建議將主觀置信度作為概率的一種解釋。Ramsey視這種解釋為概率的頻率解釋的一個(gè)補(bǔ)充,而頻率解釋在當(dāng)時(shí)更為廣泛接受。統(tǒng)計(jì)學(xué)家BrunodeFinetti于1937年采納了Ramsey的觀點(diǎn),將之作為概率的頻率解釋的一種可能的代替。L.J.Savage在《統(tǒng)計(jì)學(xué)基礎(chǔ)》(1954年)中拓展了這個(gè)思想。有人試圖將“置信度”的直觀概念進(jìn)行形式化的定義和應(yīng)用。最普通的應(yīng)用是基于打賭:置信度反映在行為主體愿意在命題上下注的意愿上。當(dāng)信任有程度的時(shí)候,概率計(jì)算的定理測(cè)量信任的理性程度,就像一階邏輯的定理測(cè)量信任的理性程度一樣。很多人將置信度視為經(jīng)典的真值(真或假)的一種擴(kuò)展。HaroldJeffreys,RichardT.Cox,EdwinJaynes和I.J.Good研探了貝葉斯理論。其他著名貝葉斯理論的支持者包括JohnMaynardKeynes和B.O.Koopman。10.1.3貝葉斯算法二貝葉斯法則的原理通常,事件A在事件B(發(fā)生)的條件下的概率,與事件B在事件A的條件下的概率是不一樣的;然而,這兩者是有確定的關(guān)系,貝葉斯法則就是這種關(guān)系的陳述。作為一個(gè)規(guī)范的原理,貝葉斯法則對(duì)于所有概率的解釋是有效的;然而,頻率主義者和貝葉斯主義者對(duì)于在應(yīng)用中概率如何被賦值有著不同的看法:頻率主義者根據(jù)隨機(jī)事件發(fā)生的頻率,或者總體樣本里面的個(gè)數(shù)來(lái)賦值概率;貝葉斯主義者要根據(jù)未知的命題來(lái)賦值概率。一個(gè)結(jié)果就是,貝葉斯主義者有更多的機(jī)會(huì)使用貝葉斯法則。貝葉斯法則是關(guān)于隨機(jī)事件A和B的條件概率和邊緣概率的。bayes&其中L(A|B)是在B發(fā)生的情況下A發(fā)生的可能性。10.1.3貝葉斯算法在貝葉斯法則中,每個(gè)名詞都有約定俗成的名稱:Pr(A)是A的先驗(yàn)概率或邊緣概率。之所以稱為"先驗(yàn)"是因?yàn)樗豢紤]任何B方面的因素。Pr(A|B)是已知B發(fā)生后A的條件概率,也由于得自B的取值而被稱作A的后驗(yàn)概率。Pr(B|A)是已知A發(fā)生后B的條件概率,也由于得自A的取值而被稱作B的后驗(yàn)概率。Pr(B)是B的先驗(yàn)概率或邊緣概率,也作標(biāo)準(zhǔn)化常量(normalizedconstant)。按這些術(shù)語(yǔ),Bayes法則可表述為:后驗(yàn)概率=(似然度*先驗(yàn)概率)/標(biāo)準(zhǔn)化常量也就是說(shuō),后驗(yàn)概率與先驗(yàn)概率和似然度的乘積成正比。10.1.3貝葉斯算法另外,比例Pr(B|A)/Pr(B)也有時(shí)被稱作標(biāo)準(zhǔn)似然度(standardisedlikelihood),Bayes法則可表述為:后驗(yàn)概率=標(biāo)準(zhǔn)似然度*先驗(yàn)概率要理解貝葉斯推斷,必須先理解貝葉斯定理。后者實(shí)際上就是計(jì)算"條件概率"的公式。所謂"條件概率"(Conditionalprobability),就是指在事件B發(fā)生的情況下,事件A發(fā)生的概率,用P(A|B)來(lái)表示。圖10-7貝葉斯圖解10.1.3貝葉斯算法根據(jù)文氏圖,可以很清楚地看到在事件B發(fā)生的情況下,事件A發(fā)生的概率就是P(A∩B)除以P(B)。即:P(A|B)=P(A∩B)/P(B)同理可得,P(B|A)=P(A∩B)/P(A)所以,
即P(A|B)=(P(B|A)*P(A))/P(B)10.1.3貝葉斯算法三.貝葉斯推斷的含義對(duì)條件概率公式進(jìn)行變形,可以得到如下形式:P(A|B)=P(A)*P(B|A)/P(B)我們把P(A)稱為"先驗(yàn)概率"(Priorprobability),即在B事件發(fā)生之前,我們對(duì)A事件概率的一個(gè)判斷。P(A|B)稱為"后驗(yàn)概率"(Posteriorprobability),即在B事件發(fā)生之后,我們對(duì)A事件概率的重新評(píng)估。P(B|A)/P(B)稱為"可能性函數(shù)"(Likelyhood),這是一個(gè)調(diào)整因子,使得預(yù)估概率更接近真實(shí)概率。所以,條件概率可以理解成下面的式子:后驗(yàn)概率=先驗(yàn)概率x調(diào)整因子這就是貝葉斯推斷的含義。我們先預(yù)估一個(gè)"先驗(yàn)概率",然后加入實(shí)驗(yàn)結(jié)果,看這個(gè)實(shí)驗(yàn)到底是增強(qiáng)還是削弱了"先驗(yàn)概率",由此得到更接近事實(shí)的"后驗(yàn)概率"。在這里,如果"可能性函數(shù)"P(B|A)/P(B)>1,意味著"先驗(yàn)概率"被增強(qiáng),事件A的發(fā)生的可能性變大;如果"可能性函數(shù)"=1,意味著B(niǎo)事件無(wú)助于判斷事件A的可能性;如果"可能性函數(shù)"<1,意味著"先驗(yàn)概率"被削弱,事件A的可能性變小。10.2.1實(shí)訓(xùn)目的和要求掌握Hadoop基本使用方法熟悉Ubuntu操作10.2.2運(yùn)用單詞計(jì)數(shù)是最簡(jiǎn)單也是最能體現(xiàn)MapReduce思想的程序之一,可以稱為MapReduce版"HelloWorld",該程序的完整代碼可以在Hadoop安裝包的"src/examples"目錄下找到。單詞計(jì)數(shù)主要完成功能是:統(tǒng)計(jì)一系列文本文件中每個(gè)單詞出現(xiàn)的次數(shù),如下圖所示。圖10-8WC圖解10.2.2運(yùn)用1.創(chuàng)建本地的示例數(shù)據(jù)文件:依次進(jìn)入【Home】-【hadoop】-【hadoop-1.2.1】創(chuàng)建一個(gè)文件夾file用來(lái)存儲(chǔ)本地原始數(shù)據(jù)。圖10-9兩個(gè)文件10.2.2運(yùn)用并在這個(gè)目錄下創(chuàng)建2個(gè)文件分別命名為【myTest1.txt】和【myTest2.txt】或者你想要的任何文件名。分別在這2個(gè)文件中輸入下列示例語(yǔ)句:圖10-10文件內(nèi)容圖10-11文件內(nèi)容10.2.2運(yùn)用2.在HDFS上創(chuàng)建輸入文件夾呼出終端,輸入下面指令:bin/hadoopfs-mkdirhdfsInput執(zhí)行這個(gè)命令時(shí)可能會(huì)提示類似安全的問(wèn)題,如果提示了,請(qǐng)使用bin/hadoopdfsadmin-safemodeleave來(lái)退出安全模式。當(dāng)分布式文件系統(tǒng)處于安全模式的情況下,文件系統(tǒng)中的內(nèi)容不允許修改也不允許刪除,直到安全模式結(jié)束。安全模式主要是為了系統(tǒng)啟動(dòng)的時(shí)候檢查各個(gè)DataNode上數(shù)據(jù)塊的有效性,同時(shí)根據(jù)策略必要的復(fù)制或者刪除部分?jǐn)?shù)據(jù)塊。運(yùn)行期通過(guò)命令也可以進(jìn)入安全模式。意思是在HDFS遠(yuǎn)程創(chuàng)建一個(gè)輸入目錄,我們以后的文件需要上載到這個(gè)目錄里面才能執(zhí)行。10.2.2運(yùn)用3.上傳本地file中文件到集群的hdfsInput目錄下在終端依次輸入下面指令:cdhadoop-1.2.1bin/hadoopfs-putfile/myTest*.txthdfsInput圖10-12過(guò)程10.2.2運(yùn)用4.運(yùn)行例子:在終端輸入下面指令:bin/hadoopjarhadoop-examples-1.2.1.jarwordcounthdfsInputhdfsOutputbin/hadoopjarhadoop-examples-*.jarwordcounthdfsInputhdfsOutput應(yīng)該出現(xiàn)下面結(jié)果:(如圖10-13)10.2.2運(yùn)用Hadoop命令會(huì)啟動(dòng)一個(gè)JVM來(lái)運(yùn)行這個(gè)MapReduce程序,并自動(dòng)獲得Hadoop的配置,同時(shí)把類的路徑(及其依賴關(guān)系)加入到Hadoop的庫(kù)中。以上就是HadoopJob的運(yùn)行記錄,從這里可以看到,這個(gè)Job被賦予了一個(gè)ID號(hào):job_201202292213_0002,而且得知輸入文件有兩個(gè)(Totalinputpathstoprocess:2),同時(shí)還可以了解map的輸入輸出記錄(record數(shù)及字節(jié)數(shù)),以及reduce輸入輸出記錄。查看HDFS上hdfsOutput目錄內(nèi)容:在終端輸入下面指令:bin/hadoopfs-lshdfsOutput在下圖10-14中是得到的結(jié)果:圖10-14生成的文件10.2.2運(yùn)用從上圖中知道生成了三個(gè)文件,我們的結(jié)果在"part-r-00000"中。使用下面指令查看結(jié)果輸出文件內(nèi)容bin/hadoopfs-catoutput/part-r-00000在下圖10-15中為分析結(jié)果圖10-15分析結(jié)果(注意:請(qǐng)忽視截圖指令中的3)輸出目錄日志以及輸入目錄中的文件是永久存在的,如果不刪除的話,如果出現(xiàn)結(jié)果不一致,請(qǐng)參考這個(gè)因素。10.3.1實(shí)訓(xùn)目的和要求掌握簡(jiǎn)單的spark編程熟悉rdd操作熟悉sparkSQl10.3.2運(yùn)用1任務(wù)描述通過(guò)spark將本地的數(shù)據(jù)上傳至spark集群(這里為單節(jié)點(diǎn))并存儲(chǔ)至數(shù)據(jù)庫(kù)中2任務(wù)要求(1)數(shù)據(jù)集來(lái)源淘寶雙11數(shù)據(jù)鏈接:/s/1kVl4flH密碼:b0ne圖10-16要讀取數(shù)據(jù)的截圖10.3.2運(yùn)用(2)建立maven項(xiàng)目配置pom文件(3)程序中的數(shù)據(jù)庫(kù)需要改成自己對(duì)應(yīng)的數(shù)據(jù)庫(kù)(4)在對(duì)應(yīng)目錄下建立要讀取的文件3知識(shí)點(diǎn)提示(1)首先將讀取的數(shù)據(jù)放在rdd中,然后將rdd轉(zhuǎn)化為datafram,中間用Record類來(lái)封裝數(shù)據(jù)(object類不用實(shí)例化),最后通過(guò)datafram存入數(shù)據(jù)庫(kù)4操作步驟提示這里主要通過(guò)idea來(lái)實(shí)現(xiàn)一下為操作步驟:(1)首先確保已經(jīng)安裝好scala和idea(2)配置好數(shù)據(jù)庫(kù)具體的字段參考程序中的類Record(3)建立maven項(xiàng)目,配置好pom依賴(4)建立Example類編譯運(yùn)行程序10.3.2運(yùn)用5實(shí)現(xiàn)的代碼importorg.apache.spark.sql.{SQLContext,SaveMode}importorg.apache.spark.{SparkConf,SparkContext}objectExample{defmain(args:Array[String]){valconf=newSparkConf().setAppName("sparksq").setMaster("local[2]")valsc=newSparkContext(conf)valsqlContext=newSQLContext(sc)valrdd=sc.textFile("/usr/sample")//將讀取的數(shù)據(jù)安空格鍵切分valresult=rdd.map(x=>{//根據(jù)逗號(hào)分隔符來(lái)切分valp=x.split(",")//將切分好的每個(gè)字段桶過(guò)樣例類來(lái)封裝Record(p(0),p(1),p(2),p(3),p(4),p(5),p(6),p(7),p(8),p(9),p(10))})10.3.2運(yùn)用importsqlContext.implicits._//dataframe的隱式轉(zhuǎn)換將rdd轉(zhuǎn)化為dataframevaldataframe=result.toDF()//建立sparksql表adataframe.registerTempTable("a")//打印表結(jié)構(gòu)dataframe.show()//查詢語(yǔ)句valsqlcommand="select*froma"valprop=newjava.util.Properties//設(shè)置數(shù)據(jù)庫(kù)用戶名及密碼prop.setProperty("user","root")prop.setProperty("password","Qwe123123")10.3.2運(yùn)用//執(zhí)行查詢語(yǔ)句并將結(jié)果寫入數(shù)據(jù)庫(kù)中sqlContext.sql(sqlcommand).write.mode(SaveMode.Append).jdbc("jdbc:mysql://localhost:3306/mysql","log3",prop)}}//創(chuàng)建樣例類caseclassRecord(user_id:String,item_id:String,cat_id:String,merchant_id:String,brand_id:String,month:String,day:String,action:String,age_range:String,gender:String,province:String)下雨10-17中是程序的運(yùn)行結(jié)果:圖10-17程序運(yùn)行結(jié)果10.3.2運(yùn)用6相關(guān)知識(shí)1、RDD是什么RDD:Spark的核心概念是RDD,指的是一個(gè)只讀的,可分區(qū)的分布式數(shù)據(jù)集,這個(gè)數(shù)據(jù)集的全部或部分可以緩存在內(nèi)存中,在多次計(jì)算間重用。為什么會(huì)產(chǎn)生RDD?(1)傳統(tǒng)的MapReduce雖然具有自動(dòng)容錯(cuò)、平衡負(fù)載和可拓展性的優(yōu)點(diǎn),但是其最大缺點(diǎn)是采用非循環(huán)式的數(shù)據(jù)流模型,使得在迭代計(jì)算式要進(jìn)行大量的磁盤IO操作。RDD正是解決這一缺點(diǎn)的抽象方法。(2)RDD的具體描述RDD(彈性數(shù)據(jù)集)是Spark提供的最重要的抽象的概念,它是一種有容錯(cuò)機(jī)制的特殊集合,可以分布在集群的節(jié)點(diǎn)上,以函數(shù)式編操作集合的方式,進(jìn)行各種并行操作。可以將RDD理解為一個(gè)具有容錯(cuò)機(jī)制的特殊集合,它提供了一種只讀、只能有已存在的RDD變換而來(lái)的共享內(nèi)存,然后將所有數(shù)據(jù)都加載到內(nèi)存中,方便進(jìn)行多次重用。a.他是分布式的,可以分布在多臺(tái)機(jī)器上,進(jìn)行計(jì)算。b.他是彈性的,計(jì)算過(guò)程中內(nèi)錯(cuò)不夠時(shí)它會(huì)和磁盤進(jìn)行數(shù)據(jù)交換。10.3.2運(yùn)用c.這些限制可以極大的降低自動(dòng)容錯(cuò)開(kāi)銷d.實(shí)質(zhì)是一種更為通用的迭代并行計(jì)算框架,用戶可以顯示的控制計(jì)算的中間結(jié)果,然后將其自由運(yùn)用于之后的計(jì)算。(3)RDD的容錯(cuò)機(jī)制實(shí)現(xiàn)分布式數(shù)據(jù)集容錯(cuò)方法有兩種:數(shù)據(jù)檢查點(diǎn)和記錄更新RDD采用記錄更新的方式:記錄所有更新點(diǎn)的成本很高。所以,RDD只支持粗顆粒變換,即只記錄單個(gè)塊上執(zhí)行的單個(gè)操作,然后創(chuàng)建某個(gè)RDD的變換序列(血統(tǒng))存儲(chǔ)下來(lái);變換序列指,每個(gè)RDD都包含了他是如何由其他RDD變換過(guò)來(lái)的以及如何重建某一塊數(shù)據(jù)的信息。因此RDD的容錯(cuò)機(jī)制又稱“血統(tǒng)”容錯(cuò)。要實(shí)現(xiàn)這種“血統(tǒng)”容錯(cuò)機(jī)制,最大的難題就是如何表達(dá)父RDD和子RDD之間的依賴關(guān)系。實(shí)際上依賴關(guān)系可以分兩種,窄依賴和寬依賴:窄依賴:子RDD中的每個(gè)數(shù)據(jù)塊只依賴于父RDD中對(duì)應(yīng)的有限個(gè)固定的數(shù)據(jù)塊;寬依賴:子RDD中的一個(gè)數(shù)據(jù)塊可以依賴于父RDD中的所有數(shù)據(jù)塊。10.3.2運(yùn)用例如:map變換,子RDD中的數(shù)據(jù)塊只依賴于父RDD中對(duì)應(yīng)的一個(gè)數(shù)據(jù)塊;groupByKey變換,子RDD中的數(shù)據(jù)塊會(huì)依賴于多有父RDD中的數(shù)據(jù)塊,因?yàn)橐粋€(gè)key可能錯(cuò)在于父RDD的任何一個(gè)數(shù)據(jù)塊中將依賴關(guān)系分類的兩個(gè)特性:第一,窄依賴可以在某個(gè)計(jì)算節(jié)點(diǎn)上直接通過(guò)計(jì)算父RDD的某塊數(shù)據(jù)計(jì)算得到子RDD對(duì)應(yīng)的某塊數(shù)據(jù);寬依賴則要等到父RDD所有數(shù)據(jù)都計(jì)算完成之后,并且父RDD的計(jì)算結(jié)果進(jìn)行hash并傳到對(duì)應(yīng)節(jié)點(diǎn)上之后才能計(jì)算子RDD。第二,數(shù)據(jù)丟失時(shí),對(duì)于窄依賴只需要重新計(jì)算丟失的那一塊數(shù)據(jù)來(lái)恢復(fù);對(duì)于寬依賴則要將祖先RDD中的所有數(shù)據(jù)塊全部重新計(jì)算來(lái)恢復(fù)。所以在長(zhǎng)“血統(tǒng)”鏈特別是有寬依賴的時(shí)候,需要在適當(dāng)?shù)臅r(shí)機(jī)設(shè)置數(shù)據(jù)檢查點(diǎn)。也是這兩個(gè)特性要求對(duì)于不同依賴關(guān)系要采取不同的任務(wù)調(diào)度機(jī)制和容錯(cuò)恢復(fù)機(jī)制。10.3.2運(yùn)用2、RDD在Spark中的地位及作用(1)為什么會(huì)有Spark?因?yàn)閭鹘y(tǒng)的并行計(jì)算模型無(wú)法有效的解決迭代計(jì)算(iterative)和交互式計(jì)算(interactive);而Spark的使命便是解決這兩個(gè)問(wèn)題,這也是他存在的價(jià)值和理由。(2)Spark如何解決迭代計(jì)算?其主要實(shí)現(xiàn)思想就是RDD,把所有計(jì)算的數(shù)據(jù)保存在分布式的內(nèi)存中。迭代計(jì)算通常情況下都是對(duì)同一個(gè)數(shù)據(jù)集做反復(fù)的迭代計(jì)算,數(shù)據(jù)在內(nèi)存中將大大提升IO操作。這也是Spark涉及的核心:內(nèi)存計(jì)算。(3)Spark如何實(shí)現(xiàn)交互式計(jì)算?因?yàn)镾park是用scala語(yǔ)言實(shí)現(xiàn)的,Spark和scala能夠緊密的集成,所以Spark可以完美的運(yùn)用scala的解釋器,使得其中的scala可以向操作本地集合對(duì)象一樣輕松操作分布式數(shù)據(jù)集。(4)Spark和RDD的關(guān)系?可以理解為:RDD是一種具有容錯(cuò)性基于內(nèi)存的集群計(jì)算抽象方法,Spark則是這個(gè)抽象方法的實(shí)現(xiàn)。10.3.2運(yùn)用3、如何操作RDD?(1)如何獲取RDDa.從共享的文件系統(tǒng)獲取,(如:HDFS)b.通過(guò)已存在的RDD轉(zhuǎn)換c.將已存在scala集合(只要是Seq對(duì)象)并行化,通過(guò)調(diào)用SparkContext的parallelize方法實(shí)現(xiàn)d.改變現(xiàn)有RDD的之久性;RDD是懶散,短暫的。(RDD的固化:cache緩存至內(nèi)錯(cuò);save保存到分布式文件系統(tǒng))(2)操作RDD的兩個(gè)動(dòng)作a.Actions:對(duì)數(shù)據(jù)集計(jì)算后返回一個(gè)數(shù)值value給驅(qū)動(dòng)程序;例如:Reduce將數(shù)據(jù)集的所有元素用某個(gè)函數(shù)聚合后,將最終結(jié)果返回給程序。b.Transformation:根據(jù)數(shù)據(jù)集創(chuàng)建一個(gè)新的數(shù)據(jù)集,計(jì)算后返回一個(gè)新RDD;例如:Map將數(shù)據(jù)的每個(gè)元素經(jīng)過(guò)某個(gè)函數(shù)計(jì)算后,返回一個(gè)姓的分布式數(shù)據(jù)集。10.3.2運(yùn)用4、RDD的創(chuàng)建方式集合并行化valarr=Array(1,2,3,4,5,6,7,8)valrdd1=sc.parallelize(arr,2)//2代表分區(qū)數(shù)量從外部文件系統(tǒng),分布式文件系統(tǒng):如hdfs文件系統(tǒng),S3valrdd2=sc.textFile("hdfs://node1:9000/words.txt")10.3.2運(yùn)用4、什么是sparksql?SparkSQL是用于結(jié)構(gòu)化數(shù)據(jù)處理的Spark模塊。與基本的SparkRDDAPI不同,SparkSQL提供的接口為Spark提供了關(guān)于數(shù)據(jù)結(jié)構(gòu)和正在執(zhí)行的計(jì)算的更多信息。在內(nèi)部,SparkSQL使用這些額外的信息來(lái)執(zhí)行額外的優(yōu)化。有幾種與SparkSQL進(jìn)行交互的方式,包括SQL和DatasetAPI。在計(jì)算結(jié)果時(shí),使用相同的執(zhí)行引擎,而不管使用哪種API/語(yǔ)言表示計(jì)算。這種統(tǒng)一意味著開(kāi)發(fā)人員可以輕松地在不同的API之間來(lái)回切換,基于這些API提供了表達(dá)給定轉(zhuǎn)換的最自然的方式。SparkSQL的一個(gè)用途是執(zhí)行SQL查詢。SparkSQL也可以用來(lái)從現(xiàn)有的Hive安裝中讀取數(shù)據(jù)。用另一種編程語(yǔ)言中運(yùn)行SQL時(shí),結(jié)果將作為數(shù)據(jù)集/數(shù)據(jù)框返回。您還可以使用命令行或通過(guò)JDBC/ODBC與SQL接口進(jìn)行交互。10.3.2運(yùn)用4、sparksql的一些操作//讀取數(shù)據(jù),將每一行的數(shù)據(jù)使用列分隔符分割vallineRDD=sc.textFile("hdfs://localhost:9000/person.txt").map(_.split(""))//定義caseclass(相當(dāng)于表的schema)caseclassPerson(name:String,age:Int)//將lineRDD轉(zhuǎn)換成personRDDvalpersonRDD=lineRDD.map(x=>Person(x(0),x(1).toInt))//將personRDD轉(zhuǎn)換成DataFramevalpersonDF=personRDD.toDF//對(duì)personDF進(jìn)行處理personDF.showpersonDF.select(personDF.col("name")).showpersonDF.select(col("name")).showpersonDF.select("name").showpersonDF.printSchema10.3.2運(yùn)用//#(SQL風(fēng)格語(yǔ)法)將DF注冊(cè)成表personDF.registerTempTable("t_person")//查詢:sqlContext.sql("select*fromt_personorderbyagedesclimit2").showsqlContext.sql("desct_person").showvalresult=sqlContext.sql("select*fromt_personorderbyagedesc")//保存結(jié)果result.save("hdfs://localhost:9000/sql/res1")10.3.2運(yùn)用6、dataFrame的介紹DataFrame:與RDD類似,DataFrame也是一個(gè)分布式數(shù)據(jù)容器。然而DataFrame更像傳統(tǒng)數(shù)據(jù)庫(kù)的二維表格,除了數(shù)據(jù)以外,還記錄數(shù)據(jù)的結(jié)構(gòu)信息,即schema。同時(shí),與Hive類似,DataFrame也支持嵌套數(shù)據(jù)類型(struct、array和map)。從API易用性的角度上看,DataFrameAPI提供的是一套高層的關(guān)系操作,比函數(shù)式的RDDAPI要更加友好,門檻更低。由于與R和Pandas的DataFrame類似,SparkDataFrame很好地繼承了傳統(tǒng)單機(jī)數(shù)據(jù)分析的開(kāi)發(fā)體驗(yàn)。DataFrame與RDD的主要區(qū)別在于,前者帶有schema元信息,即DataFrame所表示的二維表數(shù)據(jù)集的每一列都帶有名稱和類型。這使得SparkSQL得以洞察更多的結(jié)構(gòu)信息,從而對(duì)藏于DataFrame背后的數(shù)據(jù)源以及作用于DataFrame之上的變換進(jìn)行了針對(duì)性的優(yōu)化,最終達(dá)到大幅提升運(yùn)行時(shí)效率的目標(biāo)。反觀RDD,由于無(wú)從得知所存數(shù)據(jù)元素的具體內(nèi)部結(jié)構(gòu),SparkCore只能在stage層面進(jìn)行簡(jiǎn)單、通用的流水線優(yōu)化。10.3.2運(yùn)用7、dataFrame的一些操作使用SparkSession,應(yīng)用程序可以從現(xiàn)有的RDD,Hive表或Spark數(shù)據(jù)源創(chuàng)建DataFrame。舉個(gè)例子,下面根據(jù)J
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 設(shè)備安全評(píng)估與技術(shù)支持合同
- 電動(dòng)汽車換電站場(chǎng)地租賃與智能化充電解決方案協(xié)議
- 航空模擬器租賃及飛行員實(shí)戰(zhàn)演練服務(wù)合同
- 小紅書店鋪產(chǎn)品供應(yīng)鏈整合與優(yōu)化服務(wù)協(xié)議
- 婚前個(gè)人房產(chǎn)婚后增值分割及共同財(cái)產(chǎn)分割協(xié)議
- 物流自動(dòng)化設(shè)備采購(gòu)與供應(yīng)鏈優(yōu)化服務(wù)合同
- 虛擬現(xiàn)實(shí)內(nèi)容開(kāi)發(fā)與測(cè)試費(fèi)用協(xié)議
- 眼底改變護(hù)理查房
- 《親本選擇與選配》(教案)-中職農(nóng)林牧漁大類《農(nóng)業(yè)生物技術(shù)》高教版(全一冊(cè))
- 2025年無(wú)機(jī)顏料:碳黑項(xiàng)目建議書
- 中華人民共和國(guó)公共安全行業(yè)標(biāo)準(zhǔn)
- 介紹福建紅色文化
- 解分式方程50題八年級(jí)數(shù)學(xué)上冊(cè)
- GB/T 10599-2023多繩摩擦式提升機(jī)
- 蜜蜂的傳粉過(guò)程
- 公招資格復(fù)審個(gè)人委托書
- 化膿性骨髓炎臨床診療指南
- DB22-T 3454-2023 藍(lán)莓基質(zhì)栽培技術(shù)規(guī)程
- 2023急性有機(jī)磷農(nóng)藥中毒診治要求
- 人教版八年級(jí)物理下冊(cè) 實(shí)驗(yàn)題05 簡(jiǎn)單機(jī)械實(shí)驗(yàn)(含答案詳解)
- 全國(guó)優(yōu)質(zhì)課一等獎(jiǎng)人教版高中化學(xué)必修第二冊(cè)《金屬礦物的開(kāi)發(fā)利用》公開(kāi)課課件
評(píng)論
0/150
提交評(píng)論