spark streaming - 在下一次迭代中使用先前计算的数据帧

时间:2017-11-20 15:38:41

标签: scala apache-spark spark-streaming

我有一个流应用程序,它接受dstream并在Dstream上运行sql操作并将其转储到文件

dstream.foreachRDD { rdd => 
{spark.read.json(rdd)
.select("col")
.filter("value = 1")
.write.csv("s3://..")

现在我需要能够在计算中考虑以前的计算(来自eaelier批处理)(如下所示):

dstream.foreachRDD { rdd => 
   {val df = spark.read.json(rdd)
val prev_df  = read_prev_calc()
 df.join(prev_df,"id")
 .select("col")
  .filter(prev_df("value)
  .equalTo(1)
  .write.csv("s3://..")

有没有办法以某种方式将calc结果写入内存并将其用作计算的输入

2 个答案:

答案 0 :(得分:0)

您是否尝试在DStream上使用persist()方法?它会自动将该DStream的每个RDD保存在内存中。 默认情况下,DStream转换生成的所有输入数据和持久RDD都会自动清除。 此外,基于窗口的操作生成的DStream会自动保留在内存中。 有关详细信息,请查看https://spark.apache.org/docs/latest/streaming-programming-guide.html#caching--persistence https://spark.apache.org/docs/0.7.2/api/streaming/spark/streaming/DStream.html

答案 1 :(得分:0)

如果您只查看一个或两个先前计算过的数据帧,则应该查看Spark Streaming Window。

以下代码段来自spark文档。

 val windowedStream1 = stream1.window(Seconds(20))
 val windowedStream2 = stream2.window(Minutes(1))
 val joinedStream = windowedStream1.join(windowedStream2)

甚至更简单,如果我们想要在最后20秒的数据中每隔10秒进行一次字数统计,我们必须在最后30秒内对(word,1)对的DStream对应用reduceByKey操作数据的。这是使用reduceByKeyAndWindow操作完成的。

 // Reduce last 20 seconds of data, every 10 seconds
 val windowedWordCounts = pairs.reduceByKeyAndWindow((a:Int,b:Int) => (a + b), Seconds(20), Seconds(10))

更多细节和例子 - https://spark.apache.org/docs/latest/streaming-programming-guide.html#window-operations