PySpark中的状态聚合功能

时间:2018-10-02 15:16:00

标签: scala apache-spark pyspark apache-spark-sql

我正在尝试从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中,我看到可以通过扩展UserDefinedAggregateFunctionorg.apache.spark.sql.expressions.Aggregator来进行状态聚合,但是我只能在python端做类似的事情吗?

1 个答案:

答案 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