2015-05-04 81 views
0

我正在通過示例學習Spark,但我不知道理解API的好方法。舉例來說,非常經典的字數例如:閱讀和學習Spark API?

val input = sc.textFile("README.md") 
val words = input.flatMap(x => x.split(" ")) 
val result = words.map(x => (x, 1)).reduceByKey((x, y) => x + y) 

當我看到reduceByKey API,我看到:

def reduceByKey(func: (V, V) ⇒ V): RDD[(K, V)] 

的API狀態:使用關聯減少功能合併爲每個鍵的值。在將結果發送到Reducer之前,這也將在每個映射器上進行本地合併,類似於MapReduce中的「合併器」。輸出將與現有的分區/並行級別進行散列分區。

在節目指南:當要求的(K, V)對的數據集,返回(K, V)對其中對於每個鍵的值被使用給定的降低函數func,它必須是(V,V) => V類型的聚集的數據集。與groupByKey一樣,reduce任務的數量可通過可選的第二個參數進行配置。

好的,通過這個例子,我知道(x, y)(V, V),這應該是地圖的價值部分。我給出了一個函數來計算V和我得到RDD[(K, V)]。我的問題是:在這樣的例子中,在reduceByKey(func: (V, V) ⇒ V),爲什麼2 V?第一個和第二個V(V, V)是否相同?

我想我問這個問題,因此使用問題主題,因爲我仍然不知道如何正確讀取API,或者我只是想念一些基本的Spark概念?!

回答

0

reduceByKey((x, y) => x + y) 

您可以閱讀更加清晰,這樣的事情:

reduceByKey((sum, addend) => sum + addend) 

因此,對於每一個鍵,就遍歷該功能前的每一個元素與該鍵。(func:(V,V)⇒V)意味着你有一個具有某種類型(比如Int)的2個輸入的函數,它返回相同類型的單個輸出。

0

通常數據集的形式是(「key1」,val11),(「key2」,val21),(「key1」,val12),(「key2」,val22)......等等

在RDD [(K,V)]中將會出現與多個值相同的密鑰當您使用reduceByKey時。[(K,V)]

對於鍵中的每個值,該函數將被應用。

例如,考慮下面的程序

val data = Array(("key1",2),("key1",20),("key2",21),("key1",2),("key2",10),("key2",33)) 

val rdd = sc.parallelize(data) 
val res = rdd.reduceByKey((x,y) => x+y) 
res.foreach(println) 

你會得到的輸出作爲

(key2,64) 
(key1,24) 

這裏值的序列被傳遞給函數。對於key1 - >(2,20,2)

最後,您將爲每個鍵擁有一個值。

您可以使用spark shell來嘗試API。

在下面的代碼