我有一个流应用程序,它接受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结果写入内存并将其用作计算的输入
答案 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