2017-07-28 9 views
0

におけるデータフレームの選択した列のセルにカスタム関数を適用するのは、私はこのようになり、データフレームを持っているとしましょう:はPySpark

+---+-----------+-----------+ 
| id| address1| address2| 
+---+-----------+-----------+ 
| 1|address 1.1|address 1.2| 
| 2|address 2.1|address 2.2| 
+---+-----------+-----------+ 

私は文字列に直接カスタム関数を適用したいと思います例えばアドレス1アドレス2列、:

:私は私の最後のデータ・フレームは次のようになりますように、新しい列に結果を格納したい

def example(string1, string2): 
    name_1 = string1.lower().split(' ') 
    name_2 = string2.lower().split(' ') 
    intersection_count = len(set(name_1) & set(name_2)) 

    return intersection_count 

>>> df.withColumn('result', example(df.address1, df.address2)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in example 
TypeError: 'Column' object is not callable 

は、私が何を間違っているとどのように私午前:私は一度列全体に組み込み関数を適用するが、私はエラーを得た方法でそれを実行しようとした

+---+-----------+-----------+------+ 
| id| address1| address2|result| 
+---+-----------+-----------+------+ 
| 1|address 1.1|address 1.2|  2| 
| 2|address 2.1|address 2.2|  7| 
+---+-----------+-----------+------+ 

選択した列の文字列にカスタム関数を適用できますか?

答えて

1

あなたが火花で

from pyspark.sql.functions import udf 
example_udf = udf(example, LongType()) 
df.withColumn('result', example_udf(df.address1, df.address2)) 
+0

感謝をUDF(ユーザー定義関数)を使用する必要があります!私はちょうどもう一つ質問があります:なぜ我々はLongType()を特に使用していますか?それは与えられた関数によって返されるデータ型と何か関係がありますか? – Angelika

+1

はい、指定された関数の戻り値の型でなければなりません – dumitru

+0

データフレームから来ない引数を渡すことはできますか?たとえば、例を次のように定義したいとします。 def example(source_name1、source_name2、string1、string2): return json.dumps(source_name1:string1、source_name2:string2}) – Angelika