使用结构化流式传输运行链式查询(PySpark)

时间:2018-03-02 07:13:12

标签: python apache-spark pyspark spark-structured-streaming

我的代码就像

df = spark.readStream.option("header","true") \
    .schema(df_schema)\
    .csv(df_file)
df2 = df.filter(df.col == 1)
df3 = df2.withColumn("new_col", udf_f(df2.some_col))
dfc = df3.where(df3.new_col == 2).count()
query = dfc.writeStream.outputMode("append").format("console").start()
query.awaitTermination()

我在Queries with streaming sources must be executed with writeStream.start()行收到错误消息dfc,但我不确定我做错了什么。 Spark结构流不支持这样的链式查询吗?据我所知,我没有做任何分支。

编辑:

count()行中删除dfc后,我收到了来自StreamingQueryException: Exception thrown in awaitResult来电的新错误query.awaitTermination()。知道为什么count()不起作用以及新错误出现的原因?

编辑2:

如果我直接登录到控制台而不在df之后运行所有中间查询,它就可以工作。但是,每次我尝试运行其他查询时,都会引发StreamingQueryException

1 个答案:

答案 0 :(得分:1)

由于structured streaming的性质,它不可能以与静态数据帧相同的方式获得计数。创建流时,Spark使用trigger轮询源以获取新数据。如果有任何Spark将其拆分为小型DataFrame(微批)并沿着流传递(转换,聚合,输出)。

如果您需要获取记录数量,可以添加listener to get progress updates并获取onQueryProgress(QueryProgressEvent event)中的输入数量。

由于StreamingQueryExceptionfilter()在结构化流式传输中正常工作,因此很难说明为什么会得到withColumn()。 您是否在控制台中看到可能导致Exception thrown in awaitResult的其他错误?

顺便说一句,如果您在一个会话中有多个流,则应使用spark.streams.awaitAnyTermination()来阻止,直到其中任何一个终止。

以下查询应该可以正常运行:

query = spark.readStream
    .option("header","true") \
    .schema(df_schema)\
    .csv(df_file)\
    .filter(df.col == 1)\
    .withColumn("new_col", udf_f(df2.some_col))\
    .writeStream\
    .format("console")\
    .outputMode("append")\
    .start()

query.awaitTermination()
# or spark.streams().awaitAnyTermination()