是否可以在Spark Streaming中获取每个RDD的前n个元素?

时间:2015-07-21 09:45:05

标签: spark-streaming

使用Spark Streaming时,是否可以获取DStream中每个RDD的第一个n元素?在现实世界中,我的流包含许多地理标记的事件,我想采用最接近给定点的100(或其他)进行进一步处理,但是一个简单的例子显示我正在尝试做什么是这样的:

import org.apache.spark.SparkConf
import org.apache.spark.streaming.dstream.ConstantInputDStream
import org.apache.spark.streaming.{Seconds, StreamingContext}

object take {
  def main(args: Array[String]) {

    val data = 1 to 10

    val sparkConf = new SparkConf().setAppName("Take");
    val streamingContext = new StreamingContext(sparkConf, Seconds(1))

    val rdd = streamingContext.sparkContext.makeRDD(data)
    val stream = new ConstantInputDStream(streamingContext, rdd)

    // In the real world, do a bunch of stuff which results in an ordered RDD

    // This obviously doesn't work
    // val filtered = stream.transform { _.take(5) }

    // In the real world, do some more processing on the DStream

    stream.print()

    streamingContext.start()
    streamingContext.awaitTermination()
  }
}

我知道我可以很容易地将顶级n结果反馈给驱动程序,但在这种情况下我不想这样做,因为我需要在过滤后对RDD进行进一步处理下来。

1 个答案:

答案 0 :(得分:7)

为什么不起作用?我认为你的榜样很好。

  1. 您应计算每个事件的距离
  2. 按距离对事件进行排序,使用适合您的数据量的多个分区
  3. 从每个分区获取前100个事件(因此您将对初始数据的一小部分进行洗牌),使用sparkContext.parallelize(data)
  4. 使返回的集合成为新的RDD
  5. 仅使用一个分区再次排序,以便所有数据在同一数据集中混洗
  6. 参加前100场比赛,这是你的前100名
  7. 排序的代码在步骤2和4中是相同的,您只需更改分区数。

    在DStream上执行步骤1,在转换操作中对RDD执行步骤2到5。