2017-07-28 66 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 

我想要的結果存儲在一個新列,讓我最後的數據幀將如下所示:

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

我試過的方式我曾經應用了內置函數的整列來執行它,但我得到了一個錯誤:

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

什麼我做錯了,我怎麼可以將自定義函數應用於選定列中的字符串?

回答

1

你有火花,使用UDF(用戶定義函數)

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

謝謝!我還有一個問題:爲什麼我們要特別使用LongType()?它是否與給定函數返回的數據類型有關? – Angelika

+1

是的,它應該是給定函數的返回類型 – dumitru

+0

我可以傳遞不是來自數據框的附加參數嗎?例如,如果我想將示例定義爲: def示例(source_name1,source_name2,string1,string2): 返回json.dumps({source_name1:string1,source_name2:string2}) – Angelika