2017-10-17 54 views
0

的區別我有一個表像這樣來創建新的列:pyspark - 試圖基於兩個數組類型列

+-----+----+-------+-------+ 
|name | id | msg_a | msg_b | 
+-----+----+-------+-------+ 
| a| 3|[a,b,c]|[c] | 
| b| 5|[x,y,z]|[h,x,z]| 
| c| 7|[a,x,y]|[j,x,y]| 
+-----+----+-------+-------+ 

我想,這樣的msg_b但不是在msg_a什麼是浮出水面添加一列。 例如

+-----+----+-------+-------+------------+ 
|name | id | msg_a | msg_b | difference | 
+-----+----+-------+-------+------------+ 
| a| 3|[a,b,c]|[c] |NA   | 
| b| 5|[x,y,z]|[h,x,z]|[h]   | 
| c| 7|[a,x,y]|[j,x,y]|[j]   | 
+-----+----+-------+-------+------------+ 

參考一previous post,我已經試過 df.select('msg_b').subtract(df.select('msg_a')).show() 其作品,但我需要的信息表,其中nameid

這樣做: df.withColumn("difference", F.col('msg_b').subtract(F.col(''msg_a'))).show(5) 產生一個TypeError: 'Column' object is not callable

不知道是否有一個單獨的功能來執行此操作,如果我缺少明顯的東西,等等。

回答

1

你必須使用UDF

from pyspark.sql.functions import * 
from pyspark.sql.types import * 

@udf(ArrayType(StringType())) 
def subtract(xs, ys): 
    return list(set(xs) - set(ys)) 

df = sc.parallelize([ 
    (["a", "b", "c"], ["c"]), (["x", "y", "z"], ["h", "x", "z"]) 
]).toDF(["msg_a", "msg_b"]) 

df.select(subtract('msg_b', 'msg_a')) 

+----------------------+ 
|subtract(msg_b, msg_a)| 
+----------------------+ 
|     []| 
|     [h]| 
+----------------------+