当将输入传递到 pyspark 中的 pandas_udf 时,您使用 col(“name”),有时您直接使用“name”。有区别吗?另外,有人可以指出文档中允许引用这两种用法的确切行吗?我知道这两种方法都有效,但我很难说服自己,因此需要搜索相应的文档。
谢谢你
(从 databricks 教程之一中提取的示例)
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)
考虑这个功能:
def my_function(A, B, C):
....
在Python中,无论变量A、B或C的值如何,函数都会被执行。如果输入对象与预期类型不匹配,它可能会遇到失败,但无论如何都会调用函数本身。
在 Spark 的底层语言 Scala 中,具有相同名称的函数,如下所示:
def add(x: Int, y: Int): Int = x + y
def add(x: Double, y: Double): Double = x + y
作为不同的功能同时存在。使用 Spark 函数时,您实际上是在调用 Scala 函数。有些是用“字符串”作为输入(代表列名称)来定义的,而另一些是用“列”对象作为输入来定义的(
F.col("col_name")
)。在大多数情况下,两个版本都已定义,允许您互换使用其中一个,因为它们在功能上是相同的。
function("column_name")
形式是为非开发人员,特别是数据科学家而设计的。
另一方面,function(col("column_name"))
更面向对象,面向开发人员。