[英]Changing key during reduce phase
假设我的(键,值)对现在是这些:
(word1,d1=1)
(word1,d2=1)
(word2,d1=2)
(word3,d1=1)
是否可以减少到以下情况:更改密钥且该值是原始编号/它出现的次数?
(word1@d1, 1/2)
(word1@d2, 1/2)
(word2@d1, 2/1)
(word3@d1, 1/1)
我从Spark阅读了文档。 reduceByKey()将向我返回(K,V)的数据集,其中V1,V2-> V且键仍为K。但是在上述情况下,K将为K',我必须为不同的键更新V 。 有什么办法可以实现上述目标? 刚开始学习Spark,我现在很困惑。 感谢您的帮助!!
可以使用countByKey
(广播连接)和标准join
来连接全局单词计数。 目前尚不清楚类型是什么,所以让我们假设:
val sc: SparkContext
val rdd = sc.parallelize(Seq(
("word1", "d1=1"), ("word1", "d2=1"), ("word2", "d1=2"), ("word3", "d1=1")
))
与countByKey
:
val cnts = sc.broadcast(rdd.countByKey)
和map
:
rdd.map { case (k, v) => (k, (v, cnts.value.getOrElse(k, 0L))) }
collected
给出:
Array((word1,(d1=1,2)), (word1,(d2=1,2)), (word2,(d1=2,1)), (word3,(d1=1,1)))
与join
val cntsRDD = rdd.mapValues(_ => 1L).reduceByKey(_ + _)
rdd.join(cntsRDD)
collected
给出:
Array((word2,(d1=2,1)), (word3,(d1=1,1)), (word1,(d1=1,2)), (word1,(d2=1,2)))
我将根据确切的输入类型来重塑结果,作为用户的练习。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.