我正在尝试从PySpark定义一个自定义聚合器正在累积状态。在Spark 2.3中可以吗?
AFAIK,现在可以通过使用pandas_udf
关键字调用PandasUDFType.GROUPED_AGG
在Spark 2.3(参见How to define and use a User-Defined Aggregate Function in Spark SQL?)之后在PySpark中定义自定义UDAF。但是,考虑到仅将函数作为参数,我认为在聚合过程中无法携带状态。
从Scala中,我看到可以通过扩展UserDefinedAggregateFunction
或org.apache.spark.sql.expressions.Aggregator
来进行状态聚合,但是我只能在python端做类似的事情吗?
答案 0 :(得分:0)
您可以使用accumulator。
您可以利用内置state management的Spark Streaming。
用于SQL的简单累加器示例
from pyspark.sql.types import IntegerType
# have some data
df = spark.range(10).toDF("num")
# have a table
df.createOrReplaceTempView("num_table")
# have an accumulator
accSum = sc.accumulator(0)
# have a function that accumulates
def add_acc(int_val):
accSum.add(int_val)
return int_val
# register function as udf
spark.udf.register("reg_addacc", add_acc, IntegerType())
# use in sql
spark.sql("SELECT sum(reg_addacc(num)) FROM num_table").show()
# get value from accumulator
print(accSum.value)
45