Spark:如何找出两个数据集之间的不同元素?

Posted

技术标签:

【中文标题】Spark:如何找出两个数据集之间的不同元素?【英文标题】:Spark: How to find out the differenct elements betwween two dataset? 【发布时间】:2017-10-13 03:13:27 【问题描述】:

我在这里阅读了很多问答,但仍然找不到我的问题的答案。

我的问题是,即使里面有重复的值,我能找出两个数据集的交集吗?

下面的代码显示,对于重复值,数据集 t5 将无法显示其相对于数据集 t2 的额外元素“2”。

例如,我想得到类似 t5 - t2 = (1, 2) 的东西。 但是,我只能从以下代码中得到 t5 - t2 = (1):

val t1 = Seq(1, 2, 3).toDS()
val t2 = Seq(2, 3).toDS()
val t3 = Seq(3, 4).toDS()
val t4 = Seq(4, 5 ).toDS()
val t5 = Seq(1, 2, 2, 3).toDS()
val t6 = Seq(2, 2, 3).toDS()

t1.intersect(t2).show() 
> 2 3 

t1.intersect(t3).show()
> 3

t1.intersect(t4).show()
> null

t1.union(t2).except(t1.intersect(t2))
> 1

t5.intersect(t2).show()
> 2 3 

t5.intersect(t6).show()
> 2 3

t5.except(t2).show()
>1

t5.except(t6).show()
>1

t5.union(t2).except(t5.intersect(t2))
>1

t5.union(t6).except(t5.intersect(t6))
>1    

t5.join(t2, t5("value") === t2("value"), "leftanti").show()
>1

【问题讨论】:

寻找类似this 的东西? @eliasah 谢谢你的链接。我检查了一下,发现情况并非如此。处理重复键时,链接中的解决方案也有问题。问题是由“join”引入的,它也会考虑重复。 @eliasah 尝试答案后,我将结果添加到问题中。它还返回 (1) 【参考方案1】:

我的解决方案可能不是最优的,可以接受更好的解决方案。

所以,我们可以在这种情况下使用连接。

t5.join(t2, t5("value") === t2("value")).drop(t2("value")).show()

//result
+-----+
|value|
+-----+
|    2|
|    2|
|    3|
+-----+

谢谢

【讨论】:

感谢您的回答。实际上,您的解决方案只是证明了我的问题:t2 只有 (2,3),因此它与 t5 的交集应该是 (2, 3) 而不是 (2, 2, 3) 作为您的结果。否则当我想获取“在 t5 中但不在 t2 中”的元素时,我只会得到 (1) 而不是正确答案 (1, 2) 对不起,误导性问题,我添加了一些声明以使其更清楚。 嗨,Gabriele,那么您可能不想为此使用交集。 Set 的属性是无序且唯一的。如果您想实现目标,请对数据集进行分组,获取计数并减去它们。谢谢。 是的,你是对的。使用count、groupby+count、distinct可以部分解决。唯一的问题是,如果我没有唯一键,'group by' 必须有几个维度,并且操作会非常昂贵。

以上是关于Spark:如何找出两个数据集之间的不同元素?的主要内容,如果未能解决你的问题,请参考以下文章

spark 函数

Java高效找出两个大数据量List集合中的不同元素

使用 Scala 在 Apache Spark 中连接不同 RDD 的数据集

如何计算不同数据框的列之间的数值差异?

ChartJs,如何在折线图中的两个数据集之间获得不同的颜色填充?

Spark RDD在Spark中的地位和作用如何?