PySpark结构化流中多writeStream仅首个运行的问题咨询
PySpark多writeStream仅第一个运行的解决办法
PySpark完全支持多writeStream,你的问题是Socket数据源的特性导致的,以下是具体分析和解决方案:
问题原因
Socket数据源是单消费者模式,第一个流启动后会独占Socket连接的输入,第二个流只能获取到初始的空数据(对应Batch 0),之后无法再拿到新数据,所以停止输出。
解决方案
对原始数据流进行缓存,让多个下游流复用同一份数据源输入,而不是各自单独消费Socket连接:
修改代码中tweets_df1的定义部分,添加缓存操作:
tweets_df1 = spark \ .readStream \ .format("socket") \ .option("host", "127.0.0.1") \ .option("port", 9999) \ .load() \ .select(F.from_json(F.col("value").cast("string"), schema).alias("tmp")).select("tmp.*") \ .cache() # 添加这行缓存操作
之后再创建两个输出流q1和q2即可,此时两个流会共享原始流的数据,都能持续接收并输出新的批次数据。
补充说明
- 确保两个流的
checkpointLocation路径完全独立,你的代码中已经正确设置为chk1和chk2,无需修改。 - 缓存操作必须放在所有下游输出流定义之前,确保所有流都复用缓存后的数据流。
内容的提问来源于stack exchange,提问作者mattjoe182
相关产品推荐
相关产品推荐

