2017-12-22 4 views
0

Ich habe eine RDD die groupByKey wie unten war,Karte über CompactBuffer in einer RDD

(1, CompactBuffer (2.0, 3.0, 4.0)), (2, CompactBuffer (1.0, -1.0, -2.0))

Und ich möchte mapValues ​​in (1 * x_1^2, 2 * x_2^2, 3 * x_3^2)

, die wie folgt aussehen sollte,

(1, CompactBuffer (4,0 , 18.0, 48.0)), (2, CompactBuffer (1.0, 2.0, 12.0))

Was soll ich tun?

Danke für Ihre Hilfe.

+0

Wie kann ich die n-te Elemente in CompactBuffer bekommen? – ken

Antwort

1

Sie können mapValues verwenden, um die CompactBuffer Inhalte mit zip mit einem Stream(1, 2, ...), wie im folgenden zu verarbeiten:

val rdd = sc.parallelize(Seq(
    (1, 2.0), 
    (1, 3.0), 
    (1, 4.0), 
    (2, 1.0), 
    (2, -1.0), 
    (2, -2.0) 
)) 

val groupedRDD = rdd.groupByKey 
// res1: Array[(Int, Iterable[Double])] = Array(
// (1,CompactBuffer(2.0, 3.0, 4.0)), (2,CompactBuffer(1.0, -1.0, -2.0)) 
//) 

groupedRDD.mapValues(l => 
    l.zip(Stream from 1).map{ case (v, i) => v * v * i } 
) 
// res2: Array[(Int, Iterable[Double])] = Array(
// (1,List(4.0, 18.0, 48.0)), (2,List(1.0, 2.0, 12.0)) 
//) 
+0

Ich habe eine weitere Frage: [link] (https://stackoverflow.com/questions/47949324/how-to-sum-a-part-of-a-list-in-rdd) – ken

Verwandte Themen