2015-05-04 58 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。

在下面的代码