Spark-scalaI-API

來源:互聯網
上載者:User

標籤:採樣   park   成員類   區別   lines   不可變   建立   ast   array   

1、sc.version
2、叢集對象:SparkContext;獲得Spark叢集的SparkContext對象,是構造Spark應用的第一步!
SparkContext對象代表 整個 Spark叢集,是Spark架構 功能的入口 ,可以用來在叢集中建立RDD、累加器變數和廣播變數。
SparkContext對象建立時可以指明串連到哪個叢集管理器上,在Spark-Shell啟動時,預設 串連到本地的叢集管理器。
使用SparkContext對象(在Shell裡,就是sc變數)的master方法,可以查看當前串連的叢集管理器:sc.master
3、分布資料集:RDD;使用SparkContext對象建立RDD資料集,然後,才能幹點有意義的事情!
Spark的核心抽象是一個分布式資料集,被稱為彈性分布資料集(RDD) ,代表一個不可變的、可分區、可被平行處理 的成員集合。
RDD對象需要利用SparkContext對象的方法建立,Spark支援從多種來源建立RDD對象,比如:從本地文字檔建立、從Hadoop 的HDFS檔案建立、或者通過對其他RDD進行變換獲得新的RDD。
下面的樣本使用本地Spark目錄下的README.md檔案建立一個新的RDD:
    scala> val textFile = sc.textFile("README.md")
    textFile: spark.RDD[String] = [email protected]
我們看到,執行的結果是,返回了一個Spark.RDD類型的變數textFile,RDD是一個模板類,方括弧裡的String代表 這個RDD對象成員的類型。由於是一個對象,因此值用地址表示:[email protected] 。
SparkContext對象的textFile方法建立的RDD中,一個成員對應原始檔案的一行。我們看到在執行的結果中可以看到返回一個 RDD,成員類型為String,我們將這個對象儲存在變數textFile中。
使用README.md檔案,建立一個RDD,儲存到變數 textFile中。
4、操作資料集:RDD可以執行兩種操作:變換與動作
RDD的內部實現了分布計算的功能,我們在RDD上執行的操作,是透明地在整個叢集上執行的。也就是說,當RDD建立 後,這個RDD就不屬於本地了,它在整個叢集中有效。當在RDD上執行一個操作,RDD內部需要和叢集管理器進行溝通協商。
對一個RDD可以進行兩種操作:動作(action)和變換(transformation)。動作總是從叢集中取回資料,變換總是獲得一個新的RDD,這是兩種操作的字面上的差異。
事實上,當在RDD上執行一個變換時,RDD僅僅記錄要做的變換,只有當RDD上需要執行一個動作時,RDD才 通過叢集管理器啟動實質分布計算。
這有點像拍電影,變換操作只是劇本,只有導演喊Action的時候,真正的電影才開始製作。
5、感受動作和變換的區別;RDD操作分為兩種:動作和變換,只有動作才會觸發計算!
下面的例子首先做一個映射變換,然後返回新紀錄的條數。map是一個變換,負責將原RDD的每個記錄變換到新的RDD,count是一個動作,負責擷取這個RDD的記錄總數。
先執行map,你應該看到很迅速乾淨地返回:
    scala> val rdd2=textFile.map(line=>line.length)
    rdd2: org.apache.spark.rdd.RDD[Int] = MappedRDD[52] ...
再執行count,這會有些不一樣:
    scala> rdd2.count()
    ......
    res10: Long = 141
    .....
當執行map時,我們看到結果很快返回了。但當執行count時,我們可以看到一堆的提示資訊,大概的意思就是 和調度器進行了若干溝通才把資料拉回來。
看起來確實這樣,變換操作就只是寫寫劇本,Action才真正開始執行計算任務。
6、RDD動作:擷取資料的控制權;RDD動作將資料集返回本地
對一個RDD執行動作指示叢集將指定資料返回本地,返回的資料可能是一個具體的值、一個數組或一個HASH表。
讓我們先執行幾個動作:
    scala> textFile.count() // 這個動作返回RDD中的記錄數
    res0: Long = 126
   
    scala> textFile.first() // 這個動作返回RDD中的第一個記錄
count是一個動作,負責擷取這個RDD的記錄總數。first也是一個動作,負責返回RDD中的第一條記錄。
在使用Spark時,最好在腦海中明確地區隔出兩個地區:本地區和叢集域。RDD屬於叢集域,那是Spark管轄的地帶;RDD的動作結果屬於本地區,這是我們的地盤。
只有當RDD的資料返回本地區,我們才能進行再加工,比如列印等等。
7、RDD變換:資料的濾鏡;RDD變換總是返回RDD,這讓我們可以把變換串起來!
RDD變換將產生一個新的RDD。下面的例子中,我們執行一個過濾(Filter)變換,將獲得一個新的RDD,由原 RDD中符合過濾條件(即:包含單詞Spark)的記錄成員構成:
    scala> val linesWithSpark = textFile.filter(line => line.contains("Spark"))
    linesWithSpark: spark.RDD[String] = [email protected]
變數lineWithSpark現在是一個RDD,由變數textFile這個RDD中所有包含"Spakr"單詞的行構成。
由於一個RDD變換總是返回一個新的RDD,因此我們可以將變換和動作使用鏈式文法串起來。下面的 例子使用了鏈式文法解決一個具體問題:在檔案中有多少行包含單詞“Spark”?
    scala> textFile.filter(line => line.contains("Spark")).count()
    res3: Long = 15
這等同於:
    scala> val rdd1 = textFile.filter(line => line.contains("Spark"))
    ...
    scala> rdd1.count()
    res12: Long = 15
用鏈式文法寫起來更流暢一些,不過這隻是一種口味的傾向而已。
8、RDD操作組合;RDD的變換有點像PS的濾鏡,有時要用好幾個濾鏡,才能把臉修好。
RDD的諸多動作和變換,經過組合也可以實現複雜的計算,滿足相當多現實的資料計算需求。
假設我們需要找出檔案中單詞數量最多的行,做個map/reduce就可以了:
    scala> textFile.map(line => line.split(" ").size).reduce((a, b) => if (a > b) a else b)
    res4: Long = 15
上面語句首先使用map變換,將每一行(成員)映射為一個整數值(單詞數量),這獲得了一個新的RDD。然後在 這個新的RDD上執行reduce動作,找到(返回)了單詞數量最多的行。
9、count :計數
使用count成員函數獲得RDD對象的成員總數,傳回值為長整型
10、top :前N個記錄
使用top成員函數獲得RDD中的前N個記錄,可以指定一個排序函數進行排序比較。 如果不指定排序函數,那麼使用預設的Ascii碼序進行記錄排序。
傳回值包含前N個記錄的數組,記錄類型為T。
11、take:無序採樣
使用take成員函數獲得指定數量的記錄,返回一個數組。與top不同,take在提取記錄 前不進行排序,它僅僅逐分區地提取夠指定數量的記錄就返回結果。可以將take方法 視為對RDD對象的無序採樣。
傳回值包含指定數量記錄的數組,記錄類型為T。
12、first : 取第一個記錄;使用first成員函數獲得RDD中的第一個記錄。
使用RDD的first方法獲得第一條記錄。不過,沒有last方法!
13、max : 取值最大的記錄
使用max成員函數獲得值最大的記錄,可以指定一個排序函數進行排序比較。預設使用 Ascii碼序進行排序。
14、min : 取值最小的記錄
使用min成員函數獲得值最小的記錄,可以指定一個排序函數進行排序比較。預設使用 Ascii碼序進行排序。
15、reduce : 規約RDD;使用RDD的reduce方法進行彙總!
使用reduce成員函數對RDD進行規約操作,必須指定一個函數指定規約行為。
文法
    def reduce(f: (T, T) => T): T
參數 f : 規約函數 , 兩個參數分別代表RDD中的兩個記錄,傳回值被RDD用來進行遞迴計算。
樣本
下面的樣本使用匿名函數,將所有的記錄串連起來構成一個字串:
    scala> textFile.reduce((a,b)=>a+b)
    res60:String = #Apache SparkSpake is a fast...
16、collect : 收集全部記錄
使用collect成員函數獲得RDD中的所有記錄,返回一個數組。collect方法 可以視為對RDD對象的一個全採樣。
17、map : 映射
映射變換使用一個映射函數對RDD中的每個記錄進行變換,每個記錄變換後的新值集合構成一個新的RDD。
文法
    def map[U](f: (T) => U)(implicit arg0: ClassTag[U]): RDD[U]
參數
    f : 映射函數 , 輸入參數為原RDD中的一個記錄,傳回值構成新RDD中的一個記錄。
    下面的樣本將textFile的每個記錄(字串)變換為其長度值,獲得一個新的RDD,然後取回第一個記錄查看:
    scala> textFile.map(line=>line.length).first()
    res13:Int = 14
18、filter : 過濾
過濾變換使用一個篩選函數對RDD中的每個記錄進行篩選,只有篩選函數返回真值的記錄,才 被選中用來構造新的RDD。
文法
    def filter(f: (T) => Boolean): RDD[T]
參數
    f : 篩選函數,輸入參數為原RDD中的一個元素,傳回值為True或False 。
    下面的樣本僅保留原RDD中字元數多於20個的記錄(行),獲得一個新的RDD,然後取回第一個 記錄查看:
    scala> textFile.filter(line=>line.length>20).first()
    res20: String = Spark is a fast and generic .
19、sample : 採樣;使用RDD的sample方法獲得一個採樣RDD!
採樣變換根據給定的隨機種子,從RDD中隨機地按指定比例選一部分記錄,建立新的RDD。採樣變換 在機器學習中可用於進行交叉驗證。
文法
    def sample(withReplacement: Boolean, fraction: Double, seed: Long = Utils.random.nextLong): RDD[T]
參數
    withReplacement : Boolean , True表示進行替換採樣,False表示進行非替換採樣
    fraction : Double, 在0~1之間的一個浮點值,表示要採樣的記錄在全體記錄中的比例
    seed :隨機種子
樣本
下面的樣本從原RDD中隨機播放20%的記錄,構造一個新的RDD,然後返回新RDD的記錄數:
    scala> textFile.sample(true,0.2).count()
    res12: Long = 26

20、union : 合并;使用RDD的union方法,可以獲得兩個RDD的並集!
合并變換將兩個RDD合并為一個新的RDD,重複的記錄不會被剔除。
文法
    def union(other: RDD[T]): RDD[T]
參數
    other : 第二個RDD
樣本
下面的樣本,首先對textFile這個RDD進行一個每行反轉的映射變換,獲得一個新的RDD,再 將這個新的RDD和原來的RDD:textFile進行合并,最後我們使用count查看一下總記錄數:
    scala> textFile.map(line=>line.reverse).union(textFile).count()
    res13: Long = 282    
可以看到,合并後的總記錄數是原來的2倍。

21、intersection : 相交;使用RDD的intersection方法,可以獲得兩個RDD的交集!
相交變換僅取兩個RDD共同的記錄,構造一個新的RDD。
文法
    def intersection(other: RDD[T]): RDD[T]
參數
    other : 第二個RDD
樣本
下面的樣本將每個記錄進行逆轉後的RDD與原RDD相交,獲得一個新的RDD,我們使用collect回收全部 資料以便顯示:
    scala> textFile.map(line=>line.reverse).intersection(textFile).collect()
    res27: Array[String] =Array("   ","")

可以看到,只有空行被保留下來,因為空白行的逆序保持不變。

22、distinct : 剔重;使用RDD的distinct方法,可以進行記錄剔重!
剔重變換剔除RDD中的重複記錄,返回一個新的RDD。
文法
    def distinct(): RDD[T]
樣本
下面的樣本將RDD中重複的行剔除,並返回新RDD中的記錄數:
    sala> textFile.distinct().count()
    res20: Long =91



Spark-scalaI-API

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.