Scala 如何通过获取前N行来过滤排序后的RDD
我有两个键值对RDD的A和B。假设B有10000行,我已经按照它的值对B进行了排序: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
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实现同样的功能
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)