我有RDD [(Int,Array [Double])] 例如:
1, Array(2.0,5.0,6.3)
5, Array(1.0,3.3,9.5)
1, Array(5.0,4.2,3.1)
2, Array(9.6,6.3,2.3)
1, Array(8.5,2.5,1.2)
5, Array(6.0,2.4,7.8)
2, Array(7.8,9.1,4.2)
我必须收集第一列的不同值,并根据该数组排列整个RDD。
val label_array = rdd.map(_._1).collect.distinct
输出:数组(1,5,2),现在我必须根据label_array安排数据。
必需的输出
1, Array(2.0,5.0,6.3)
1, Array(5.0,4.2,3.1)
1, Array(8.5,2.5,1.2)
5, Array(1.0,3.3,9.5)
5, Array(6.0,2.4,7.8)
2, Array(9.6,6.3,2.3)
2, Array(7.8,9.1,4.2)
我试过了
val ordering = (1,5,2).productIterator.toList.zipWithIndex.toMap
rdd.sortBy{case (k,v) => ordering(k)}
但是如何获得所需的输出作为数组将是变化的(元素和大小差异)。如何根据数组格式对RDD进行排序?
答案 0 :(得分:0)
只需zipWithIndex
label_array
你就可以了
val ordering = label_array.zipWithIndex.map(x => (x._1, x._2)).toMap
你应该拥有ordering
地图
scala.collection.immutable.Map[Int,Int] = Map(1 -> 0, 5 -> 1, 2 -> 2)
答案 1 :(得分:0)
更简单的方法是创建一个具有不同第一列的新RDD并与之前的原始列连接
以下是简单示例
val rdd = spark.sparkContext.parallelize(Seq(
(1, Array(2.0,5.0,6.3)),
(5, Array(1.0,3.3,9.5)),
(1, Array(5.0,4.2,3.1)),
(2, Array(9.6,6.3,2.3)),
(1, Array(8.5,2.5,1.2)),
(5, Array(6.0,2.4,7.8)),
(2, Array(7.8,9.1,4.2))
)
)
val distinct = rdd.map(v => (v._1, 1))distinct()
//(v._1, 1)this is done because you need key value to join
//now join distinct with previous original RDD
distinct.join(rdd).map(v => (v._1, v._2._2))
输出:
1, Array(2.0,5.0,6.3)
1, Array(5.0,4.2,3.1)
1, Array(8.5,2.5,1.2)
5, Array(1.0,3.3,9.5)
5, Array(6.0,2.4,7.8)
2, Array(9.6,6.3,2.3)
2, Array(7.8,9.1,4.2)