【问题标题】:Difference between columns of ArrayType in dataframe数据框中 ArrayType 列之间的差异
【发布时间】:2025-12-07 05:30:01
【问题描述】:

我有 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 任何帮助将不胜感激。

【问题讨论】:

  • 结果如何?
  • 它给出了value的所有值
  • 你能粘贴示例数据吗?理想情况下它应该工作
  • 希望你用过collection.SeqLike.diff
  • 请分享示例数据和预期输出。

标签: scala apache-spark apache-spark-sql spark-dataframe


【解决方案1】:

您需要将您的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")

【讨论】:

    【解决方案2】:

    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,那么您将获得 A 值,如示例所示。 根据 scala,这是非常有效的案例,因为您告诉您总是得到value,即 seq。

    还有,反例是这样的……

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

    【讨论】: