我有一个数据集,如下所示-
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()