如何通过前N行过滤排序的RDD

时间:2017-03-11 07:34:39

标签: scala apache-spark

我有2个键值对RDD&A,我使用的A和B.让我们说B有10000行,我按其值排序B:

B = B0.map(_.swap).sortByKey().map(_.swap)

我需要从B获得前5000名并使用它与A一起加入。我知道我能做到:

B1 = B.take(5000)

B1 = B.zipWithIndex().filter(_._2 < 5000).map(_._1)

似乎两者都会触发计算。由于B1只是一个中间结果,我希望它不会触发实际计算。有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

据我所知,没有其他方法可以使用RDD实现这一目标。但是你可以利用数据框来实现同样的目标。

  1. 首先将您的RDD转换为数据帧。
  2. 然后将数据帧限制为限制5000值。
  3. 然后您可以从数据框中选择新的RDD。
  4. 到目前为止,火花不会触发计算。
  5. 以下是概念验证示例。

      def main(arg: Array[String]): Unit = {
        import spark.implicits._
        val a =
          Array(
            Array("key_1", "value_1"),
            Array("key_2", "value_2"),
            Array("key_3", "value_3"),
            Array("key_4", "value_4"),
            Array("key_5", "value_5")
          )
    
        val rdd = spark.sparkContext.makeRDD(a)
        val df = rdd.map({
          case Array(key, value) => PairRdd(key, value)
        }).toDF()
    
        val dfWithTop = df.limit(3)
        val rddWithTop = dfWithTop.rdd
        // upto this point no computation has been triggered
        // rddWithTop.take(100) will trigger computation
      }
    
      case class PairRdd(key: String, value: String)