如何在PySpark 2.1.0中的事件时间窗口上定义UDAF

时间:2017-03-12 12:14:42

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

Problem definition

我正在编写一个Python应用程序,它将窗口滑过一系列值,每个值都带有一个时间戳。我想将一个函数应用于滑动窗口中的值,以便从N个最新值计算得分,如图所示。我们已经使用Python库实现了该函数来使用GPU。

我发现Apache Spark 2.0附带了Structured Streaming,它支持事件时间的窗口操作。如果要从.csv文件中读取有限的记录序列并想要在这样的滑动窗口中计算记录,可以在PySpark中使用以下代码:

from pyspark.sql import SparkSession, SQLContext
from pyspark.sql.types import StructType
from pyspark.sql.functions import window
from os import getcwd

spark = SparkSession \
    .builder \
    .master('local[*]') \
    .getOrCreate()

schema = StructType() \
    .add('ts', 'timestamp') \
    .add('value', 'double') \

sqlContext = SQLContext(spark)
lines = sqlContext \
    .readStream \
    .format('csv') \
    .schema(schema) \
    .load(path='file:///'+getcwd()+'/csv')

windowedCount = lines.groupBy(
    window(lines.ts, '30 minutes', '10 minutes')
).agg({'value':'count'}) 

query = windowedCount \
   .writeStream \
    .outputMode('complete') \
    .format('console') \
    .start()

query.awaitTermination()

但是,我想在滑动窗口上应用除预定义聚合函数之外的UDAF。根据{{​​3}},可用的聚合函数只有avg,max,min,sum和count。

它尚不支持?如果是这样,它何时会在PySpark中得到支持?

https://spark.apache.org/docs/latest/api/python/pyspark.sql.html?highlight=agg#pyspark.sql.GroupedData.agg表明可以在Java或Scala中定义UserDefinedAggregateFunction,然后在PySpark中调用它。这似乎很有趣,但我想在滑动窗口中应用我自己的Python函数。我想要纯粹的Pythonic方式。

P.S。让我知道PySpark以外的任何可以解决这类问题的框架(在流上滑动的窗口上应用UDAF)。

1 个答案:

答案 0 :(得分:1)

在Spark< 2.3中,你无法做到这一点。

对于Spark> = 2.3,这对于Grouped数据是可能的,但对于使用“带有Pandas的PySpark UDAF”的Windows还没有。

目前,PySpark无法在Windows上运行UserDefined功能。

以下是一个很好描述的SO问题:Applying UDFs on GroupedData in PySpark (with functioning python example)

以下是添加此功能的JIRA票证 ​​- https://issues.apache.org/jira/browse/SPARK-10915