根据Array()内容对RDD进行排序

时间:2017-07-04 06:08:59

标签: arrays sorting apache-spark rdd

我有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进行排序?

2 个答案:

答案 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)