[英]How to reduceByKey?
我正在Cloudera QuickStart VM中使用Spark控制台。
下面提供了一個輸出文件。 它顯示前20條記錄。 每條記錄都是電視頻道名稱及其相應觀看者數量的組合。 有幾百條記錄。
目標是按電視頻道名稱對RDD(channel_views)進行分組,以便每個記錄都是電視頻道名稱及其對應觀看者總數的唯一顯示。
channel_views = joined_dataset.map(extract_channel_views)
以下是我為了產生所需的輸出/目標而苦苦掙扎的一組代碼
def some_function(a,b):
some_result = a + b
return some_result
channel_views.reduceByKey(some_function).collect()
以下代碼的輸出:
channel_views.take(20)
[(1038, u'DEF'),
(1038, u'CNO'),
(1038, u'CNO'),
(1038, u'NOX'),
(1038, u'MAN'),
(1038, u'MAN'),
(1038, u'XYZ'),
(1038, u'BAT'),
(1038, u'CAB'),
(1038, u'DEF'),
(415, u'DEF'),
(415, u'CNO'),
(415, u'CNO'),
(415, u'NOX'),
(415, u'MAN'),
(415, u'MAN'),
(415, u'XYZ'),
(415, u'BAT'),
(415, u'CAB'),
(415, u'DEF')]
您正在處理向后的數據集。 使用map
(或更改您的提取)將元組從(count,name)
交換為(name, count)
byKey
方法使用元組中的第一項作為鍵,因此您的代碼將連接字符串,按原樣鍵入計數。
我不了解python,所以我在Scala中做到了。 您可以轉換為python。 所以你去
scala> val input = sc.parallelize(Seq((1038, "DEF"),
| (1038, "CNO"),
| (1038, "CNO"),
| (1038, "NOX"),
| (1038, "MAN"),
| (1038, "MAN"),
| (1038, "XYZ"),
| (1038, "BAT"),
| (1038, "CAB"),
| (1038, "DEF"),
| (415, "DEF"),
| (415, "CNO"),
| (415, "CNO"),
| (415, "NOX"),
| (415, "MAN"),
| (415, "MAN"),
| (415, "XYZ"),
| (415, "BAT"),
| (415, "CAB"),
| (415, "DEF"))
| )
input: org.apache.spark.rdd.RDD[(Int, String)] = ParallelCollectionRDD[12] at parallelize at <console>:22
scala> val data = input.map( v => (v._2,v._1) )
data: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[13] at map at <console>:24
scala> data.foreach(println)
(BAT,1038)
(DEF,415)
(CNO,415)
(BAT,415)
(CAB,415)
(DEF,415)
(MAN,1038)
(XYZ,1038)
(CNO,1038)
(NOX,1038)
(DEF,1038)
(MAN,1038)
(CNO,415)
(MAN,415)
(CAB,1038)
(XYZ,415)
(NOX,415)
(CNO,1038)
(MAN,415)
(DEF,1038)
scala> val result = data.reduceByKey( (x,y) => x+y)
result: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[14] at reduceByKey at <console>:26
scala> result.foreach(println)
(NOX,1453)
(MAN,2906)
(CNO,2906)
(CAB,1453)
(DEF,2906)
(BAT,1453)
(XYZ,1453)
scala>
這是pyspark代碼:
for i in channel_views.map(lambda rec: (rec[0], rec[1])).reduceByKey(lambda acc, value: acc+value): print(i)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.