数据框中 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 will always have values while column2 may have empty array.
your comment : it gives all values of value – 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()
您需要将 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 个 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 will always have values while column2 may have empty array.
your comment : it gives all values of value – 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()
您需要将 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")