首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Apache Spark中使用reduceByKey (Scala)

在Apache Spark中使用reduceByKey (Scala)
EN

Stack Overflow用户
提问于 2014-06-06 06:58:08
回答 3查看 68.8K关注 0票数 24

我有一个类型为:(user id,name,count)的元组列表。

例如,

val x = sc.parallelize(List(
    ("a", "b", 1),
    ("a", "b", 1),
    ("c", "b", 1),
    ("a", "d", 1))
)

我试图将这个集合简化为一个每个元素名称都会被计算在内的类型。

因此在上面的代码中,val x被转换为:

(a,ArrayBuffer((d,1), (b,2)))
(c,ArrayBuffer((b,1)))

下面是我目前使用的代码:

val byKey = x.map({case (id,uri,count) => (id,uri)->count})

val grouped = byKey.groupByKey
val count = grouped.map{case ((id,uri),count) => ((id),(uri,count.sum))}
val grouped2: org.apache.spark.rdd.RDD[(String, Seq[(String, Int)])] = count.groupByKey

grouped2.foreach(println)

我正在尝试使用reduceByKey,因为它的执行速度比groupByKey快。

如何实现reduceByKey而不是上面的代码来提供相同的映射?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-06 07:18:15

遵循您的代码:

val byKey = x.map({case (id,uri,count) => (id,uri)->count})

你可以这样做:

val reducedByKey = byKey.reduceByKey(_ + _)

scala> reducedByKey.collect.foreach(println)
((a,d),1)
((a,b),2)
((c,b),1)

PairRDDFunctions[K,V].reduceByKey接受一个关联reduce函数,该函数可以应用于RDD(K,V)的to类型V。换句话说,您需要一个函数f[V](e1:V, e2:V) : V。在这种特殊的情况下,在Int上使用sum:(x:Int, y:Int) => x+y_ + _使用简短的下划线表示法。

对于记录:reduceByKeygroupByKey执行得更好,因为它尝试在随机/减少阶段之前本地应用reduce函数。groupByKey将在分组之前强制对所有元素进行混洗。

票数 30
EN

Stack Overflow用户

发布于 2014-06-06 13:06:44

您的源数据结构为: RDD(String,String,Int),只有当数据结构为RDD(K,V)时才能使用reduceByKey

val kv = x.map(e => e._1 -> e._2 -> e._3) // kv is RDD[((String, String), Int)]
val reduced = kv.reduceByKey(_ + _)       // reduced is RDD[((String, String), Int)]
val kv2 = reduced.map(e => e._1._1 -> (e._1._2 -> e._2)) // kv2 is RDD[(String, (String, Int))]
val grouped = kv2.groupByKey()            // grouped is RDD[(String, Iterable[(String, Int)])]
grouped.foreach(println)
票数 6
EN

Stack Overflow用户

发布于 2014-08-11 20:49:11

语法如下:

reduceByKey(func: Function2[V, V, V]): JavaPairRDD[K, V],

这说明对于RDD中的相同键,它将获取值(这肯定是相同类型的),执行作为函数一部分提供的操作,并返回与父RDD相同类型的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24071560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档