PySpark Pandas UDF中col("name")与直接用列名的区别及文档依据
PySpark中pandas_udf传入
col("name")与直接传"name"的差异及文档依据 两者的差异
在调用由pandas_udf装饰生成的函数时,这两种写法本质等价,核心区别仅在于使用场景:
- 直接传字符串
"name"是Spark提供的语法糖,Spark会自动将字符串解析为对应列的Column对象,简化代码编写 - 若需要对列进行额外转换操作(如类型转换
col("name").cast("int")、数值计算col("name") * 2等),则必须显式使用col("name")这类Column对象,直接传字符串无法实现这类复杂操作
官方文档依据
PySpark官方文档中关于pandas UDF的调用规则明确说明:调用pandas UDF时,允许传递Column对象或列名字符串作为参数。这是因为Spark的函数调用接口本身支持将列名字符串自动映射为对应的Column引用,属于官方认可的简化写法。
结合你提供的示例代码:
from pyspark.sql.functions import pandas_udf @pandas_udf("double") def predict(*args: pd.Series) -> pd.Series: model_path = f"runs:/{run.info.run_id}/model" model = mlflow.sklearn.load_model(model_path) # Load model pdf = pd.concat(args, axis=1) return pd.Series(model.predict(pdf)) prediction_df = spark_df.withColumn("prediction", predict(spark_df.columns)) display(prediction_df)
这里predict(spark_df.columns)直接传入列名字符串列表,Spark会自动将每个字符串转为对应的Column对象,最终传递给predict函数的参数依然是pd.Series类型,和显式传入col对象的效果完全一致。
内容的提问来源于stack exchange,提问作者terrygryffindor
相关产品推荐
相关产品推荐

