Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何通过获取前N行来过滤排序后的RDD_Scala_Apache Spark - Fatal编程技术网

Scala 如何通过获取前N行来过滤排序后的RDD

Scala 如何通过获取前N行来过滤排序后的RDD,scala,apache-spark,Scala,Apache Spark,我有两个键值对RDD的A和B。假设B有10000行,我已经按照它的值对B进行了排序: B = B0.map(_.swap).sortByKey().map(_.swap) 我需要从B中获得前5000名,然后用它加入A。我知道我可以做到: B1 = B.take(5000) 或 B1=B.zipWithIndex().filter(u.\u 2

我有两个键值对RDD的A和B。假设B有10000行,我已经按照它的值对B进行了排序:

B = B0.map(_.swap).sortByKey().map(_.swap)
我需要从B中获得前5000名,然后用它加入A。我知道我可以做到:

B1 = B.take(5000)

B1=B.zipWithIndex().filter(u.\u 2<5000).map(u.\u 1)

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

据我所知,没有其他方法可以使用RDD实现这一点。但您可以利用dataframe实现同样的功能

  • 首先将RDD转换为数据帧
  • 然后将数据帧限制为5000值
  • 然后可以从数据帧中选择新的RDD
  • 到目前为止,spark不会触发任何计算
  • 下面是一个概念示例

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