我正在尝试实现一个简单的逻辑:
我有一个流式数据框,正在侦听目录中的传入文件,并且我想根据第一个记录的字段进行特定的转换。
开箱即用,不支持此操作(因此出现错误),但 But ,我敢肯定,一定有某种方法可以实现此目的。请注意,在分支之前,我不需要每次都处理整个文件。
(我可能会误认为结构化流可能正在按记录和微批处理组记录,因此我可能需要在每次迭代中测试我的FOO / BAR字段。不确定这一点。任何说明/解决方案欢迎。)
文件1
文件2
文件3
...
过程文件1 =>如果第一个记录的类型为FOO,请执行FOO JOIN
______________ =>如果第一个记录为BAR类型,则执行BAR JOIN
过程文件2 ....
#Define Streaming Dataframe
DF = spark.readStream.schema(myschema).csv('/data/input')
#Test for an event type
EVENT_TYPE = DF.select('EVENT_TYPE').head().EVENT_TYPE #UNSUPPORTED
#If Foo Do Foo Transformation
if (EVENT_TYPE == 'FOO'):
DF_NEXT = (DF.join(DF_FOO, DF.ID == DF_FOO.ID)
#If Bar Do Bar Transformation
elif (EVENT_TYPE == 'BAR'):
DF_NEXT = (DF.join(DF_BAR, DF.ID == DF_BAR.ID)
#Write Stream
DF_NEXT.writeStream.format("csv") \
.option("checkpointLocation",'/check') \
.outputMode("append") \
.start("/data/output")
pyspark.sql.utils.AnalysisException:
“必须使用writeStream.start()执行带有流源的查询”