结构化流如何执行pandas_udf?

时间:2019-12-06 15:17:44

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

我想了解结构化流处理如何处理新数据。

如果同时有更多行到达,请将其附加到输入流数据帧中,对吧?

如果我有一个withColumn并应用了pandas_udf,该函数每行调用一次,或者仅调用一次,然后将这些行传递给pandas_udf?

我们这样说:

dfInt = spark \
    .readStream \
    .load() \
    .withColumn("prediction", predict( (F.struct([col(x) for x in (features)]))))

如果更多行同时到达,则将它们一起处理或每行处理一次?= 是否有机会将其每次限制为仅一行?

1 个答案:

答案 0 :(得分:1)

  

如果同时有更多行到达,请将其附加到输入流数据帧中,对吧?

我们只讨论微批量执行引擎,对吧?这就是您最有可能在流式查询中使用的内容。

结构化流使用Source.getBatch(DataSource API V1)在流查询中查询流源:

  

getBatch(开始:Option [Offset],结束:Offset):DataFrame

     

返回偏移量(startend]之间的数据。当startNone时,批处理应从第一条记录开始。

DataFrame中,无论源返回什么,都是要在微批处理中处理的数据。

  

如果我有一个withColumn并应用pandas_udf,则该函数每行调用一次

总是。这就是用户定义函数在Spark SQL中的工作方式。

  

或仅一次将行传递到pandas_udf?

This说:

  

Pandas UDF是用户定义的函数,由Spark使用Arrow来传输数据,并通过Pandas处理数据来执行。

     

Python函数应将pandas.Series作为输入并返回相同长度的pandas.Series。在内部,Spark将通过将列拆分为批处理并将每个批处理的函数作为数据的子集调用,然后将结果串联在一起来执行Pandas UDF。

     

如果更多行同时到达,则将它们一起处理还是每行处理一次?

如果“到达”的意思是“单个DataFrame的一部分”,则“将它们一起处理”,但一次(根据UDF合同)一次一行。

  

是否有机会将每次限制为仅一行?

您不必。就是这样设计的。一次仅一行。