Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala数据帧中数据表连接的操作_Scala_Dataframe - Fatal编程技术网

scala数据帧中数据表连接的操作

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| +---+---+ 作为回答 我在尝试

给定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|
+---+---+
作为回答

我在尝试类似的东西

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