[英]Difference between columns of ArrayType in dataframe
我有2個ArrayType列的數據框。 我想找到列之間的區別。 column1將始終具有值,而column2可能具有空數組。 我創建了以下udf,但它無法正常工作
df.show()
給出以下記錄
樣本數據:
["Test", "Test1","Test3", "Test2"], ["Test", "Test1"]
碼:
sc.udf.register("diff", (value: Column,value1: Column)=>{
value.asInstanceOf[Seq[String]].diff(value1.asInstanceOf[Seq[String]])
})
輸出:
["Test2","Test3"]
Spark版本1.4.1任何幫助將不勝感激。
column1將始終具有值,而column2可能具有空數組。
你的評論 :它給出了所有值的值 - undefined_variable
讓我們看看像這樣的小例子......
val A = Seq(1,1)
A: Seq[Int] = List(1, 1)
val B = Seq.empty
B: Seq[Nothing] = List()
A diff B
res0: Seq[Int] = List(1, 1)
如果你做一個collection.SeqLike.diff
然后你會得到一個值,如例子所示。 根據scala,這是非常有效的情況,因為你告訴你總是得到seq的value
。
另外,反向情況就是這樣......
B diff A
res1: Seq[Nothing] = List()
如果您使用Spark udf進行上述操作,則會產生相同的結果。
val p = Seq("Test", "Test1","Test3", "Test2")
p: Seq[String] = List(Test, Test1, Test3, Test2)
val q = Seq("Test", "Test1")
q: Seq[String] = List(Test, Test1)
p diff q
res2: Seq[String] = List(Test3, Test2)
這是您的預期輸出,如您的示例中所示。
q diff p
res3: Seq[String] = List()
您需要將您的udf
更改為:
val diff_udf = udf { ( a: Seq[String],
b: Seq[String]) => a diff b }
然后這工作:
import org.apache.spark.sql.functions.col
df.withColumn("diff",
diff_udf(col("col1"), col("col2"))).show
+--------------------+-----------------+------------------+
| col1| col2| diff|
+--------------------+-----------------+------------------+
|List(Test, Test1,...|List(Test, Test1)|List(Test3, Test2)|
+--------------------+-----------------+------------------+
數據
val df = sc.parallelize(Seq((List("Test", "Test1","Test3", "Test2"),
List("Test", "Test1")))).toDF("col1", "col2")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.