Skip to main content
 首页 » 编程设计

python之curry UDF之Pyspark

2024年10月01日3498°冷暖

我正在尝试在 spark 中实现一个 UDF;可以将文字和列作为参数。为此,我相信我可以使用柯里化(Currying) UDF。

该函数用于将字符串文字与 DataFrame 的列中的每个值相匹配。我总结了以下代码:-

def matching(match_string_1): 
    def matching_inner(match_string_2): 
        return difflib.SequenceMatcher(None, match_string_1, match_string_2).ratio() 
    return matching 
 
hc.udf.register("matching", matching) 
matching_udf = F.udf(matching, StringType()) 
 
df_matched = df.withColumn("matching_score", matching_udf(lit("match_string"))(df.column)) 
  • "match_string" 实际上是分配给我正在迭代的列表的值。

不幸的是,这并没有像我希望的那样工作;我收到了

"TypeError: 'Column' object is not callable".

我相信我没有正确调用这个函数。

请您参考如下方法:

应该是这样的:

def matching(match_string_1): 
    def matching_inner(match_string_2): 
        return difflib.SequenceMatcher( 
            a=match_string_1, b=match_string_2).ratio() 
 
    # Here create udf. 
    return F.udf(matching_inner, StringType()) 
 
df.withColumn("matching_score", matching("match_string")(df.column)) 

如果你想支持 match_string_1 的 Column 参数,你必须像这样重写它:

def matching(match_string_1): 
    def matching_inner(match_string_2): 
        return F.udf( 
            lambda a, b: difflib.SequenceMatcher(a=a, b=b).ratio(), 
            StringType())(match_string_1, match_string_2) 
 
    return  matching_inner 
 
df.withColumn("matching_score", matching(F.lit("match_string"))(df.column) 

您当前的代码不起作用,matching_udf 是和 UDF 并且 matching_udf(lit("match_string")) 创建一个 Column 表达式而不是调用内部函数。