1. 程式人生 > >Spark MLlib 學習入門筆記

Spark MLlib 學習入門筆記

RDD(Resilient Distributed Datasets)分散式彈性資料集,將資料分佈儲存在不同節點的計算機記憶體中進行儲存和處理。RDD的任務被分成兩部分:Transformation和Action。Transformation用於對RDD的建立,即一個RDD轉換為另一個RDD,Action是資料計算執行部分,如count、reduce、collect等。 Spark文件裡有相關的說明,網上還有一個Spark文件的中文翻譯,可以參考。從程式設計的角度來看,一開始把RDD當成一個數組,並記住它的執行任務由Transformation運算元和Action運算元共同完成,得到運算結果就好了。

以下是我在學習RDD時完成的一道練習題,通過這道練習,可以掌握RDD程式設計的基本思路和方法。

對機器學習資料iris.data資料集進行簡單的處理,包括filter、count、distince和分類統計(求和、最大值、最小值和平均值)。

1. 資料說明

[plain] view plain copy

  1. 5.1,3.5,1.4,0.2,Iris-setosa  

  2. 4.9,3.0,1.4,0.2,Iris-setosa  

  3. 4.7,3.2,1.3,0.2,Iris-setosa  

  4. 4.6,3.1,1.5,0.2,Iris-setosa  

  5. 5.0,3.6,1.4,0.2,Iris-setosa  

第一個資料septal length;第二個資料sepal width;第三個資料petal length;第四個資料petal width;第五個資料class標籤;在程式中用name表示,相當於key。


2.原始碼

Iris.scala

[plain] view plain copy

  1. package basic.iris  

  2. /**  

  3.   * Created by Oliver on 2017/5/18.  

  4.   */  

  5. //1. sepal length in cm  

  6. //2. sepal width in cm  

  7. //3. petal length in cm  

  8. //4. petal width in cm  

  9. //5. class:  

  10. class Iris extends java.io.Serializable {  

  11.   var sl: Double = 0  

  12.   var sw: Double = 0  

  13.   var pl: Double = 0  

  14.   var pw: Double = 0  

  15.   var sl_max: Double = 0  

  16.   var sw_max: Double = 0  

  17.   var pl_max: Double = 0  

  18.   var pw_max: Double = 0  

  19.   var sl_min: Double = 0  

  20.   var sw_min: Double = 0  

  21.   var pl_min: Double = 0  

  22.   var pw_min: Double = 0  

  23.   var name: String =""  

  24.   var count: Int = 1  

  25.   override def toString : String = {  

  26.     var s =  "(" + name + ", "  

  27.     s = s + "[ " + "%.1f".format(sl) + ", " + "%.1f".format(sl_min) + ", " + "%.1f".format(sl_max) + ", " + "%.1f".format(sl/count) + " ], "  

  28.     s = s + "[ " + "%.1f".format(sw) + ", " + "%.1f".format(sw_min) + ", " + "%.1f".format(sw_max) + ", " + "%.1f".format(sw/count) + " ], "  

  29.     s = s + "[ " + "%.1f".format(pl) + ", " + "%.1f".format(pl_min) + ", " + "%.1f".format(pl_max) + ", " + "%.1f".format(pl/count) + " ], "  

  30.     s = s + "[ " + "%.1f".format(pw) + ", " + "%.1f".format(pw_min) + ", " + "%.1f".format(pw_max) + ", " + "%.1f".format(pw/count) + " ], "  

  31.     s = s + count.toString + ")"  

  32.     return s  

  33.   }  

  34. }  

IrisStat.scala

[plain] view plain copy

  1. package basic.iris  

  2. import org.apache.spark.{SparkConf, SparkContext}  

  3. /**  

  4.   * Created by Oliver on 2017/5/18.  

  5.   */  

  6. //local  

  7. //E:/MyProject/SparkDiscover/data/iris.data  

  8. object IrisStat {  

  9.   def isValid(line: String): Boolean = {  

  10.     val parts = line.split(",")  

  11.     return parts.length == 5  

  12.   }  

  13.   def parseLine(line: String): (String, Iris) = {  

  14.     val parts = line.split(",")  

  15.     val iris = new Iris  

  16.     iris.sl = parts(0).toDouble  

  17.     iris.sw = parts(1).toDouble  

  18.     iris.pl = parts(2).toDouble  

  19.     iris.pw = parts(3).toDouble  

  20.     iris.sl_min = parts(0).toDouble  

  21.     iris.sw_min = parts(1).toDouble  

  22.     iris.pl_min = parts(2).toDouble  

  23.     iris.pw_min = parts(3).toDouble  

  24.     iris.sl_max = parts(0).toDouble  

  25.     iris.sw_max = parts(1).toDouble  

  26.     iris.pl_max = parts(2).toDouble  

  27.     iris.pw_max = parts(3).toDouble  

  28.     iris.name = parts(4)  

  29.     return (iris.name, iris)  

  30.   }  

  31.   def add(a: Iris, b: Iris): Iris = {  

  32.     val c = new Iris  

  33.     c.sl = a.sl + b.sl  

  34.     c.sw = a.sw + b.sw  

  35.     c.pl = a.pl + b.pl  

  36.     c.pw = a.pw + b.pw  

  37.     c.count = a.count + b.count  

  38.     c.name = a.name  

  39.     //比較大小  

  40.     c.sl_max = math.max(a.sl_max, b.sl_max)  

  41.     c.sw_max = math.max(a.sw_max, b.sw_max)  

  42.     c.pl_max = math.max(a.pl_max, b.pl_max)  

  43.     c.pw_max = math.max(a.pw_max, b.pw_max)  

  44.     c.sl_min = math.min(a.sl_min, b.sl_min)  

  45.     c.sw_min = math.min(a.sw_min, b.sw_min)  

  46.     c.pl_min = math.min(a.pl_min, b.pl_min)  

  47.     c.pw_min = math.min(a.pw_min, b.pw_min)  

  48.     return c  

  49.   }  

  50.   def printResult(res: (String, Iris)){  

  51.     println(res._2)  

  52.   }  

  53.   def main(args: Array[String]){  

  54.     val conf = new SparkConf().setMaster(args(0)).setAppName("Iris")  

  55.     val sc = new SparkContext(conf)  

  56.     val data = sc.textFile(args(1)).filter(isValid(_))  

  57.     // distinct  

  58.     println("---1---------------------------")  

  59.     data.map(_.split(",")(4)).distinct().foreach(println)  

  60.     // 簡單計數  

  61.     val c = data.count()  

  62.     val c_setosa = data.filter( "Iris-setosa" == _.split(",")(4) ).count()  

  63.     val c_versicolor = data.filter( "Iris-versicolor" == _.split(",")(4) ).count()  

  64.     val c_virginica = data.filter( "Iris-virginica" == _.split(",")(4) ).count()  

  65.     println("")  

  66.     println("---2---------------------------")  

  67.     println(c, c_setosa, c_versicolor, c_virginica)  

  68.     // mapreduce 分組求和、求平均、求最大最小  

  69.     //data.map(parseLine(_)).foreach(println)  

  70.     println("")  

  71.     println("---3---------------------------")  

  72.     data.map(parseLine(_)).reduceByKey(add(_,_)).collect().foreach(printResult)  

  73.   }  

  74. }  

3.執行配置

0?wx_fmt=png

4. 執行結果

[plain] view plain copy

  1. ---1---------------------------  

  2. Iris-setosa  

  3. Iris-versicolor  

  4. Iris-virginica  

  5. ---2---------------------------  

  6. (150,50,50,50)  

  7. ---3---------------------------  

  8. (Iris-setosa, [ 250.3, 4.3, 5.8, 5.0 ], [ 170.9, 2.3, 4.4, 3.4 ], [ 73.2, 1.0, 1.9, 1.5 ], [ 12.2, 0.1, 0.6, 0.2 ], 50)  

  9. (Iris-versicolor, [ 296.8, 4.9, 7.0, 5.9 ], [ 138.5, 2.0, 3.4, 2.8 ], [ 213.0, 3.0, 5.1, 4.3 ], [ 66.3, 1.0, 1.8, 1.3 ], 50)  

  10. (Iris-virginica, [ 329.4, 4.9, 7.9, 6.6 ], [ 148.7, 2.2, 3.8, 3.0 ], [ 277.6, 4.5, 6.9, 5.6 ], [ 101.3, 1.4, 2.5, 2.0 ], 50)  

5.程式碼說明

1)Iris.scala

Iris類存放資料檔案的5個欄位,當count為1是單個物件的資料,即資料檔案的一行。當count大於1時,表示對多行資料的對應欄位進行求和運算後的結果,count行計數,_min和_max欄位存放的是對應欄位的最小值和最大值。過載了toString輸出結果。

2)IrisStat.scala 

isValid用於判斷資料是否是有效資料,無效則拋棄,完成一個RDD轉換,相當於資料清洗。

parseLine解析資料,將字串轉換為物件,方便後續處理。

add執行運算,包括求和、計數、最大值和最小值,平均值在輸出是用“和”除以“計數”就得到了。

main函式說明:

(1) data = sc.textFile(args(1)).filter(isValid(_)) 過濾無效資料,如果不過濾,只要資料集中有一行錯誤資料,程式就會出錯,如混入一個空行。

(2) distinct ,map是用split得到第5個欄位,然後對第5個欄位應用distince就可以了。

(3) filter,輸入過濾條件就可以了,然後在呼叫count計數。

(4)分組求和、最小值和最大值,調研map傳人parseLine函式轉換得到一個新資料集,這個資料集是(String, Iris)的<key, value>形式,再呼叫reduceByKey就實現了分組操作;在reduceByKey中傳入add執行所定義的執行,呼叫collect返回資料集,用foreach列印結果。 

(5)注意下劃線,理解為要傳入的資料就好了,如filter(isValid(_))中,filter把上一個map的資料通過_傳給isValid。

0?wx_fmt=gif

相關推薦

Spark MLlib 學習入門筆記

RDD(Resilient Distributed Datasets)分散式彈性資料集,將資料分

Apache Spark MLlib學習筆記(六)MLlib決策樹類演算法原始碼解析 2

上篇說道建立分類決策樹模型呼叫了trainClassifier方法,這章分析trainClassifier方法相關內容 按照以下路徑開啟原始碼檔案: /home/yangqiao/codes/spark/mllib/src/main/scala/org/ap

Spring MVC學習入門筆記

分享圖片 快捷 png epo 為什麽 學習 -c ava 報錯 使用Spring步驟 添加依賴 創建xml文件 配置(需要被管理的類)bean 實例化上下文類 GetBean對象 使用idea新建一個maven項目,在pom.xml中添加依賴: <depe

python3.6。爬蟲學習入門筆記

爬蟲 前提知識: URL HTTP協議 web前端,html css js ajax re,Xpath XML 爬蟲的定義 百度上詳細的介紹 三大步驟:

mangoDb 學習入門筆記

  目錄 為什麼選擇mangoDb 連線方法: 基本操作方法 插入(增) 更新和查詢(改) 刪除操作 索引   為什麼選擇mangoDb     連線方法: 基

深度學習入門筆記(二)————線性神經網路解決異或問題(程式碼)

首先梳理一下思路 輸入為1,0。00異或為0,01異或為1,10異或為1,11異或為0.所以輸出為2類如下圖可知,需要兩條線劃分。 Madaline用間接地辦法解決。多個線性函式進行劃分,然後對各個神經元的輸出做邏輯運算。如圖,用兩條直線實現了異或的劃分。   線

深度學習入門筆記系列 ( 二 )——基於 tensorflow 的一些深度學習基礎知識

本系列將分為 8 篇 。今天是第二篇 。主要講講 TensorFlow 框架的特點和此係列筆記中涉及到的入門概念 。 1.Tensor 、Flow 、Session 、Graphs TensorFlow 從單詞上可以分成 Tensor 和 Flow 兩個單詞 。Ten

深度學習入門筆記系列(三)——感知器模型和 tensorboard 的使用方法

本系列將分為 8 篇 。今天是第三篇 。主要講講感知器模型和 tensorboard 的基本使用方法 。 1. 感知器模型 因為小詹之前寫過一篇感知器模型的介紹 ,這裡就不贅述了 。有需要鞏固的點選如下連結跳轉即可 : 2. tensorboard Tenso

機器學習入門筆記

本系類筆記主要是學習莫煩的機器學習視訊而寫的,以防遺忘. 一.機器學習型別 ① 監督學習(有資料,有標籤)    例如:給計算機看貓和狗的照片從而讓計算機分辨出貓狗.以及神經網路 ② 非監督學習(有資料,無標籤)   例如:不告訴計算機誰是貓誰是狗,

Spark機器學習筆記——基於MovieLens資料集使用Spark進行電影資料分析

1、資料集下載https://grouplens.org/datasets/movielens2、資料集下檔案格式u.user使用者屬性檔案包含user.id使用者ID    gender性別   occupation職業    ZIP code郵編等屬性,每個屬性之間用|分

程式設計師的機器學習入門筆記(七):推薦系統入門介紹

介紹 背景 隨著網際網路行業的井噴式發展,獲取資訊的方式越來越多,人們從主動獲取資訊逐漸變成了被動接受資訊,資訊量也在以幾何倍數式爆發增長。舉一個例子,PC時代用google reader,常常有上千條未讀部落格更新;如今的微信公眾號,也有大量的紅點未閱

Django學習入門筆記(三)

模型部分講解   本文是自己學習做的筆記,如有雷同純屬巧合,如有問題請指出,謝謝! 基於環境Ubuntu16.04 python3.6 Django 2.07 [儲備知識] ORM(物件object-關係relationship-對映map) ORM的作用-&g

深度學習——入門筆記(3)

此處是硬著頭皮跳過得(反向傳播,因為我發現我看的懂每一句話,每一個推導,但是去細想很多東西卻有種轟然崩塌得感覺,所以繼續進行) 改善神經網路的方式:(其實就是將結果優化的方式) 1.交叉成本熵函式 錯誤的定義是無意義的,因為人類是從錯誤中學習的,但是根據常識,人犯的錯誤越大,學習效果越好

深度學習——入門筆記(1)

最近有個三天小長假,也沒有什麼繁瑣的事兒,正好用來學點東西。自己根據自己的特點,找了本實踐和理論結合的深度學習的書,也不想那麼多,看完再說。 以前喜歡做筆記,但是發現找起來太麻煩,所以這次嘗試著些部落格吧。 書籍連結:http://neuralnetworksanddeeplearning.

Spark機器學習筆記——Spark分類模型(線性迴歸、樸素貝葉斯、決策樹、支援向量機)

一、分類模型的種類 1.1、線性模型 1.1.1、邏輯迴歸 1.2.3、線性支援向量機 1.2、樸素貝葉斯模型 1.3、決策樹模型 二、從資料中抽取合適的特徵 MLlib中的分類模型通過LabeledPoint(label: Double, features

Udacity機器學習入門筆記——自選演算法 隨機森林

自選三個演算法之一:隨機森林引數調整學習(Google自帶翻譯ε=(´ο`*))))在ud120-projects\choose_your_own\your_algorithm.py中新增以下程式碼from sklearn.ensemble import RandomFore

.net Elasticsearch 學習入門筆記

一. es安裝相關1.elasticsearch安裝  執行http://localhost:9200/2.head外掛3.bigdesk外掛安裝(安裝細節百度:windows elasticsearch 安裝,有詳細內容) 二. es外掛相關http://www.searchtech.pro/elas

深度學習入門筆記

之前研討會各種聽老闆和師兄談論deep learning的話題,自己也就聽一聽,這段時間出於瞭解論文的目的仔細研究了一下,感覺內部挺複雜的,不過若只是需要了解原理,其實還比較簡單。 首先推薦一

500多頁的機器學習入門筆記,下載超5萬次,都講了些什麼?

導讀:今年 4 月,樑勁在百度雲盤上傳了一份自己整理的學習筆記——《機器學習——從入門到放棄》。

深度增強學習入門筆記(一)

知乎專欄智慧單元的學習筆記,僅為自己學習所用,侵刪。 從OpenAI看深度學習研究前沿 OpenAI的三個主要研究方向 1. 深度生成模型 Deep Generative Model 通過學習現有的資料生成新的資料。 相關研究