簡體   English   中英

數據框中ArrayType列之間的差異

[英]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

例1:

讓我們看看像這樣的小例子......

   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進行上述操作,則會產生相同的結果。

編輯:(如果你修改你的例子,一個數組不是空的情況)

例2:

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM