2017-08-24 7 views
2

私はsparkでUDFを実装しようとしています。リテラルとカラムの両方を引数として取ることができます。これを達成するために、私はカレーUDFを使用できると信じています。Curried UDF - Pyspark

この関数は、文字列リテラルを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".

私はこの機能を正しく呼んでいないと思います。

答えて

2

それはこのようなものでなければなりません:あなたはmatch_string_1ためColumn引数をサポートしたい場合は、このようにそれを書き換える必要があるでしょう

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)) 

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式を作成します。

関連する問題