首页 > 解决方案 > 我可以将 spark 数据帧作为参数发送给 pandas UDF

问题描述

是否可以将 spark 数据帧作为参数发送给 pandas UDF 并获得 pandas 数据帧作为返回。下面是我正在使用的示例代码集,在调用函数时出现错误:

import pandas as pd
from pyspark.sql import SparkSession
from pyspark.sql.functions import pandas_udf



spark = SparkSession \
    .builder \
    .appName("PrimeBatch") \
    .master("local[*]") \
    .getOrCreate()

srcFile = <Some CSV file>
df = spark.read.option("header",True)\
    .csv(srcFile)

# Declare the function and create the UDF
@pandas_udf("Count int")
def count_udf(v: pd.DataFrame) -> pd.DataFrame:
    return v.count()

p_df = count_udf(df)
p_df

我在运行代码时遇到的错误如下:

TypeError:参数无效,不是字符串或列:<class 'pyspark.sql.dataframe.DataFrame'> 类型的 DataFrame[]。对于列文字,使用“lit”、“array”、“struct”或“create_map”函数。

提前致谢!!!

标签: pythonpandasdataframeapache-sparkpyspark

解决方案


一般来说, aPandas UDF会采取Pandas.Series. 您定义的count_udf函数只是一个普通函数,它接受一个pandas DataFrame并返回一个pandas DataFrame

如果您想将spark DataFrame转换为pandas DataFrame,那么您可以尝试以下操作:

pandas_df  = df.toPandas()

您可以参考以下链接以更好地了解如何应用 panda UDF:

  1. 为 pyspark 引入矢量化 udf
  2. Spark Pandas UDF

推荐阅读