咖喱 UDF - Pyspark
Curried UDF - Pyspark
我正在尝试在 spark 中实现一个 UDF;可以将文字和列作为参数。为此,我相信我可以使用柯里化的 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
表达式而不是调用内部函数。
我正在尝试在 spark 中实现一个 UDF;可以将文字和列作为参数。为此,我相信我可以使用柯里化的 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
表达式而不是调用内部函数。