如何使用具有((key1,value),(key2,value))模式的Apache Spark查找键的所有值的总和



我有一个数据集,如下所示-

A  B  C
(a,c,30)
(a,b,20)
(b,c,10)
(c,d,1)

现在我需要处理以上数据以获得如下输出-A列中的任何键都将乘以C的2倍B列中的任何密钥都将乘以C 的3倍

因此,这里的预期输出将是-

a   100      =30*2+20*2
b   80       =20*3+10*2
c   122      =30*3+10*3+1*2
d   3        =1*3 

我可以写如下-

val x = sc.parallelize(List(
  ("a","b",20),
  ("b","c",10),
  ("a","c",30),
  ("c","d",1)
))
val myVal = x.map({
  case (a,b,c) => ((a-> 2 * c), (b -> 3 * c))
})
myVal.foreach(println)

输出-

((a,60),(c,90))
((c,2),(d,3))
((a,40),(b,60))
((b,20),(c,30))

在那之后,我再也无法打破它了如何使用spark-scala获得预期结果?

重点是首先使其平面化-将一个值与一个键相关联。然后可以使用reduceByKey操作来对其进行汇总。

我不是scala开发人员,但像这样的东西可能会起作用。

myVal
  .flatMap({ case (a, b, c) => List(a -> 2 * c, b -> 3 * c) })
  .reduceByKey((a, b) => a + b)
  .foreach(println(_))

这里列出的是一个每次都必须创建的额外对象,最好避免它。所以,这样的方法可能会奏效——浏览数据两次,但之前要缓存。

myVal.cache()
  .map({ case (a, b, c) => a -> 2 * c })
  .union(rdd.map({ case (a, b, c) => b -> 3 * c }))
  .reduceByKey((a, b) => a + b)
  .foreach(println(_))
myVal.unpersist()

最新更新