Pandas 是否可以使用熊猫UDF转换包?
是否可以在包(即结构数组)上使用UDF实现聚合操作(例如,求和、平均值、方差等),以替代高阶函数 例如,使用高阶函数,我可以实现行李的平均值,如下所示Pandas 是否可以使用熊猫UDF转换包?,pandas,apache-spark,pyspark-dataframes,Pandas,Apache Spark,Pyspark Dataframes,是否可以在包(即结构数组)上使用UDF实现聚合操作(例如,求和、平均值、方差等),以替代高阶函数 例如,使用高阶函数,我可以实现行李的平均值,如下所示 df = df.withColumn("average_field", expr("aggregate(bag['bag_field'], (cast( '0' as double) as sum, cast( '0' as double) as n), (acc, x) -> (acc.sum + x, acc.n + 1), acc -
df = df.withColumn("average_field", expr("aggregate(bag['bag_field'], (cast( '0' as double) as sum, cast( '0' as double) as n), (acc, x) -> (acc.sum + x, acc.n + 1), acc -> acc.sum / acc.n * 1.0)"))
import pandas as pd
from pyspark.sql.functions import pandas_udf, PandasUDFType
def pavg(v):
return v.mean()
udf_avg = pandas_udf(pavg, functionType=PandasUDFType.GROUPED_AGG, returnType=DoubleType())
my_original_fields = df.columns
df = df.groupBy(my_original_fields).agg(udf_avg(df.bag['bag_field'])).alias("average_field")
df.show()
这个实现的问题是,我必须实现平均值,而不能使用库的现有实现。相比之下,使用pandas UDF很有吸引力,因为我可以利用pandas和numpy库函数,同时使用apachearrow最小化(反)序列化开销
我尝试了udf,但它对我不起作用,因为我在将包传递到udf时会收到大小不匹配错误,在传递包['bag_field']时会收到ArrowNotImplemented错误,因为它不支持StructType
我最近的一次尝试是使用分组的UDF,如下所示
df = df.withColumn("average_field", expr("aggregate(bag['bag_field'], (cast( '0' as double) as sum, cast( '0' as double) as n), (acc, x) -> (acc.sum + x, acc.n + 1), acc -> acc.sum / acc.n * 1.0)"))
import pandas as pd
from pyspark.sql.functions import pandas_udf, PandasUDFType
def pavg(v):
return v.mean()
udf_avg = pandas_udf(pavg, functionType=PandasUDFType.GROUPED_AGG, returnType=DoubleType())
my_original_fields = df.columns
df = df.groupBy(my_original_fields).agg(udf_avg(df.bag['bag_field'])).alias("average_field")
df.show()
此实现出现以下错误:ArrowInvalid:无法将[1.99 1.99 1.99 1.99 1.99 1.99 1.99]转换为numpy类型。ndarray:尝试转换为double。能否放置数据帧的完整示例版本?无法使用您提供的单行程序重新生成数据框。您能提供完整的数据框示例版本吗?无法使用您提供的单行程序重新生成它。