Apache spark 跨多个批处理组合数据的有状态转换
对于spark数据流应用程序,我需要访问以前的批处理数据帧/RDD, 因此,为了更好地理解,我尝试重新创建一个玩具示例 用例:每5分钟获取一次字数,但当某个条件为真时,我应该能够获取最后30分钟的字数 在spark文档中,检查点功能描述如下 数据检查点-将生成的RDD保存到可靠的存储中。 这在一些组合数据的有状态转换中是必要的 跨多个批次。在这种转换中,生成的RDD 取决于以前批次的RDD,这会导致 依赖链随时间不断增加 我不确定,一旦我检查了数据,如何访问以前的批处理RDD 我尝试使用localcheckpoint,但在处理程序(rdd)的“else”方法中失败,这表明它找不到df 注意:我知道我们有像reduceByKey和updateStateByKey这样的选项,但这些选项不适用于我的情况。如果我可以访问上一批的DF或RDD,这将更容易Apache spark 跨多个批处理组合数据的有状态转换,apache-spark,spark-streaming,dstream,checkpointing,Apache Spark,Spark Streaming,Dstream,Checkpointing,对于spark数据流应用程序,我需要访问以前的批处理数据帧/RDD, 因此,为了更好地理解,我尝试重新创建一个玩具示例 用例:每5分钟获取一次字数,但当某个条件为真时,我应该能够获取最后30分钟的字数 在spark文档中,检查点功能描述如下 数据检查点-将生成的RDD保存到可靠的存储中。 这在一些组合数据的有状态转换中是必要的 跨多个批次。在这种转换中,生成的RDD 取决于以前批次的RDD,这会导致 依赖链随时间不断增加 我不确定,一旦我检查了数据,如何访问以前的批处理RDD 我尝试使用loca
import sys
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, IntegerType, StringType
spark = SparkSession.builder.master("local").appName("Word Count").getOrCreate()
flag = True
def handler(rdd):
global flag
if not rdd.isEmpty():
if flag:
df=spark.read.json(rdd)
df = df.localCheckpoint()
flag=False
else:
df1=spark.read.json(rdd)
df = df.union(df1)
df = df.localCheckpoint()
df.show()
if __name__ == "__main__":
sc=spark.sparkContext
ssc = StreamingContext(sc, 2)
brokers, topic = sys.argv[1:]
kvs = KafkaUtils.createDirectStream(ssc, [topic],{"metadata.broker.list": brokers})
lines = kvs.map(lambda x: x[1])
lines.foreachRDD(handler)
ssc.start()
ssc.awaitTermination()