繁体   English   中英

在还原阶段更改密钥

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM