Spark鍵值對操作(python實驗版)

說明:此處介紹的是pair RDD特有的操作,前面介紹的基礎RDD操作,也適用pair RDD。

一、創建pair RDD

1、將普通RDD轉換成pair RDD時,使用map()實現。

pairs = lines.map(lambda x: (x.split(" ")[0], x))  #在Python中使用第一個單詞作爲鍵創建出一個pair RDD,如圖:


二、Pair RDD的轉化操作

(以鍵值對集合{(1, 2), (3, 4), (3, 6)}爲例)

1、reduceByKey(func) :合併具有相同鍵的值。


2、groupByKey() :對具有相同鍵的值進行分組,常用於單個數據分組,多個數據按鍵分組,參考下面函數cogroup( )


上圖最後結果:[(1,[2]),(3,[4,6])]

上面collect()是一個ResultIterable結果集迭代對象,我使用了list()函數轉換爲列表,然後打印。

3、combineByKey( createCombiner,mergeValue,mergeCombiners,partitioner) :使用不同的返回類型合併具有相同鍵的值。

4、mapValues(func) :對pairRDD中的每個值應用一個函數而不改變鍵。


5、flatMapValues(func) :對pair RDD 中的每個值應用一個返回迭代器的函數,然後對返回的每個元素都生成一個對應原鍵的鍵值對記錄。通常用於符號化。


6、keys() :返回一個僅包含鍵的RDD


7、values() :返回一個僅包含值的RDD


8、sortByKey() :返回一個根據鍵排序的RDD

    該函數常用於數據排序,接收一個叫作ascending 的參數,表示我們是否想要讓結果按升序排序(默認值爲True)。還有一個參數numPartitions,該參數決定排序後的RDD的分區個數,默認排序後的分區個數和排序之前的個數相等,有時我們也可能想按完全不同的排序依據進行排序。要支持這種情況,我們可以提供自定義的比較函數。

升序:

       

降序:

       

自定義:

     #以字符串順序對整數進行自定義排序

      

以上是針對一個鍵值對集合,下面是針對兩個pair RDD的轉化操作(rdd = {(1, 2), (3, 4), (3, 6)} other = {(3, 9)})

1、subtractByKey :刪掉RDD 中鍵與other RDD 中的鍵相同的元素


2、join :對兩個RDD進行內連接


3、rightOuterJoin :對兩個RDD 進行連接操作,確保第一個RDD的鍵必須存在(右外連接)


4、leftOuterJoin :對兩個RDD進行連接操作,確保第二個RDD 的鍵必須存在(左外連接)


5、cogroup():將兩個RDD中擁有相同鍵的數據分組到一起


上面結果:[ ( 1 , ( [2] , [ ] ) ) , (3 , ( [4 , 6] , [9] ) ) ]

注意:上面2、3、4、5是連接操作,將有鍵的數據與另一組有鍵的數據一起使用是對鍵值對數據執行的最有用的操作之一。連

接數據可能是pair RDD最常用的操作之一。連接方式多種多樣:右外連接、左外連接、交叉連接以及內連接。

三、Pair RDD的行動操作(以鍵值對集合{(1, 2), (3, 4), (3, 6)}爲例)

1、countByKey() :對每個鍵對應的元素分別計數


因爲countByKey()已經是行動操作,所以測試時,不能用c.collect()了,直接print c則可。

2、collectAsMap() :將結果以映射表的形式返回,以便查詢


注意:上面第一個操作結果中只有2對值,因爲collectAsMap()使用時,如果RDD中同一個Key中存在多個Value,那麼後面的Value將會把前面的Value覆蓋,最終得到的結果就是Key唯一,而且對應一個Value。

3、lookup(key) :返回給定鍵對應的所有值











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章