map
是最簡單的,它本質上說,做序列的每個元素在給定的操作並返回結果序列(非常類似於foreach)。 flatMap
是同樣的事情,但不是隻有一個元素每個元素返回你被允許返回一個序列(可以爲空)。這是一個解釋difference between map
and flatMap
的答案。最後reduceByKey
需要聚合函數(意味着它採用兩個相同類型的參數和返回類型,也應該是交換和關聯,否則你會得到不一致的結果),這是用於聚合每V
每個K
在你的(K,V)
對序列。
例*:
reduce (lambda a, b: a + b,[1,2,3,4])
這是說集合體+
整個列表,它會做
1 + 2 = 3
3 + 3 = 6
6 + 4 = 10
final result is 10
者皆減少,除了你同樣的事情做一個減少每個獨特鍵。
所以要解釋它在你的榜樣
file = spark.textFile("hdfs://...") // open text file each element of the RDD is one line of the file
counts = file.flatMap(lambda line: line.split(" ")) //flatMap is needed here to return every word (separated by a space) in the line as an Array
.map(lambda word: (word, 1)) //map each word to a value of 1 so they can be summed
.reduceByKey(lambda a, b: a + b) // get an RDD of the count of every unique word by aggregating (adding up) all the 1's you wrote in the last step
counts.saveAsTextFile("hdfs://...") //Save the file onto HDFS
那麼,爲什麼算的話這種方式,原因是節目的MapReduce的範例是高度並行,從而擴展到這樣做計算TB或甚至數PB的數據。
我不使用python多告訴我,如果我犯了一個錯誤。
我不是專家,但我認爲flatMap建立從嵌套結構(字行的名單?)的列表,地圖應用功能的所有元素,一個d reduceByKey按鍵對這些元素進行分組(我猜這裏是相同的單詞),並將函數(這裏是一個和)成對地應用。這可能會計數文本中每個單詞的出現次數。 – user189
如果您使用函數式語言來進行函數式編程,事情會變得更加簡潔和易於閱讀。即我強烈建議使用Scala而不是OO腳本語言。 Scala功能更強大,對Spark更具性能,並且更容易挖掘Spark代碼。你的代碼變成:'spark.textFile(「hdfs:// ...」).flatMap(_。split(「」))。map((_,1))。reduceByKey(_ + _)。saveAsTextFile 「hdfs:// ...」)' – samthebest