scala数据帧中数据表连接的操作
给定scala中的两个数据帧,T1,T2,我只想在T1中保留值,其中ID存在于T2中,但值不存在于T2中。比如说 T1 T2 对于ID=1,值x,y存在于T2,对于ID=2,值x存在于T2,对于ID=3,值x,y存在于T2,对于ID=4,值x,y,z存在于T2,对于ID=5,值x存在于T3,因此排除这些值,我们得到scala数据帧中数据表连接的操作,scala,dataframe,Scala,Dataframe,给定scala中的两个数据帧,T1,T2,我只想在T1中保留值,其中ID存在于T2中,但值不存在于T2中。比如说 T1 T2 对于ID=1,值x,y存在于T2,对于ID=2,值x存在于T2,对于ID=3,值x,y存在于T2,对于ID=4,值x,y,z存在于T2,对于ID=5,值x存在于T3,因此排除这些值,我们得到 +---+---+ | ID|val| +---+---+ | 1| z| | 2| y| | 3| z| | 3| k| +---+---+ 作为回答 我在尝试
+---+---+
| ID|val|
+---+---+
| 1| z|
| 2| y|
| 3| z|
| 3| k|
+---+---+
作为回答
我在尝试类似的东西
T1.join(T2, Seq("ID", "val")).filter(T1.col("ID")===T2.col("ID") && T1.col("val")===T2.col("val"))
但不确定这是否是正确/有效的方法
任何帮助都将不胜感激。我对scala有点陌生。您有几种方法可以实现此操作 此操作是df1和df2之间的区别,您可以使用dataframe API尝试以下方法:
val result2=df1。除了(df2)
result2.show()
+---+---+
|ID | val|
+---+---+
|1 | z|
|3 | z|
|2 | y|
|3 | k|
+---+---+
使用Dataframe API的另一种方法是使用anti-join
val joinCondition=col(“ID”)==col(“ID1”)和col(“val”)==col(“val1”)
val result3=df1.join(df2,joinCondition,“left_anti”)
result3.show()
+---+---+
|ID | val|
+---+---+
|1 | z|
|3 | z|
|2 | y|
|3 | k|
+---+---+
最后,这种方法将数据帧转换为一个集合,以计算两个集合之间的差异
val设置=(df1.collect().toSet--df2.collect().toSet).toList
val结果=sc
.parallelize(设置.map(r=>(r(0).toString.toInt,r(1).toString)))
.toDF(“ID”、“val”)
result.show()
+---+---+
|ID | val|
+---+---+
|2 | y|
|3 | z|
|3 | k|
|1 | z|
+---+---+
+---+---+
| ID|val|
+---+---+
| 1| z|
| 2| y|
| 3| z|
| 3| k|
+---+---+
T1.join(T2, Seq("ID", "val")).filter(T1.col("ID")===T2.col("ID") && T1.col("val")===T2.col("val"))