【发布时间】:2022-01-19 07:42:53
【问题描述】:
我写了一个 pandas UDF,它返回一列的值,而另一列有它的最大值
@F.pandas_udf("string")
def belonging_to_max_udf(value_of: pd.Series, where_this_is_max: pd.Series) -> str :
mx = where_this_is_max.max()
if not pd.isnull(mx):
return_value = value_of[where_this_is_max == mx]
return return_value.iloc[0]
return None
但是,“value_of”列可以是任何类型。在这个特定示例中,它是一个字符串列。但是,我也想将此函数用于其他列类型,而不必为所有可能的返回类型编写单独的函数,即我不想执行以下操作:
@F.pandas_udf("string")
def belonging_to_max__STRING_udf(value_of: pd.Series, where_this_is_max: pd.Series) -> str :
mx = where_this_is_max.max()
if not pd.isnull(mx):
return_value = value_of[where_this_is_max == mx]
return return_value.iloc[0]
return None
@F.pandas_udf("double")
def belonging_to_max_DOUBLE_udf(value_of: pd.Series, where_this_is_max: pd.Series) -> float:
mx = where_this_is_max.max()
if not pd.isnull(mx):
return_value = value_of[where_this_is_max == mx]
return return_value.iloc[0]
return None
... etc for other types
有什么好办法解决这个问题吗?
我尝试过重载:
@F.pandas_udf("string")
@F.pandas_udf("double")
def belonging_to_max_udf(value_of: pd.Series, where_this_is_max: pd.Series) -> Any:
mx = where_this_is_max.max()
if not pd.isnull(mx):
return_value = value_of[where_this_is_max == mx]
return return_value.iloc[0]
return None
但是没有用。
【问题讨论】:
-
不知道我是否理解。您用
string、double定义的是UDF 的返回类型,它与您的输入类型(即value_of)无关。请参阅pyspark.sql.functions.pandas_udf 了解更多信息。是否要根据输入列动态设置 UDF 的返回值? -
您好弗拉德西夫,感谢您的回复。我理解这个字符串,double 涉及 UDF 的返回类型。但是,UDF 返回 value_of 列的值(更具体地说,该列的值对应于 where_this_is_max 取其最大值的索引)。 value_of 列可以是 string-column(其中 UDF 的返回类型为 string)或 double 列(其中 UDF 的返回类型为 double),或任何其他类型(boolean、int 等)
标签: python apache-spark pyspark user-defined-functions