我有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只是一个中间结果,我希望它不会触发实际计算。有没有更好的方法来实现这一目标?
答案 0 :(得分:0)
据我所知,没有其他方法可以使用RDD实现这一目标。但是你可以利用数据框来实现同样的目标。
以下是概念验证示例。
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)