Scala 在两个数据帧中查找公共行,并在第一个数据帧中标记公共行
我正在使用Scala进行Spark上的链接预测项目。我的目标是找到两个数据帧之间的公共行(其中一个包含所有链接的基本事实),并在第一个数据帧中标记它们。因此,标记行将表示现有行。 例如,我有以下数据帧:Scala 在两个数据帧中查找公共行,并在第一个数据帧中标记公共行,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我正在使用Scala进行Spark上的链接预测项目。我的目标是找到两个数据帧之间的公共行(其中一个包含所有链接的基本事实),并在第一个数据帧中标记它们。因此,标记行将表示现有行。 例如,我有以下数据帧: +---+---+ +---+---+ |id1|id2| |id1|id2| +---+---+ +---+---+ | 2 | 3 | | 4 | 1 | | 1 | 4 | | 2 | 3 | +---+---+ +---+---+ 我希望结果是: +---+-
+---+---+ +---+---+
|id1|id2| |id1|id2|
+---+---+ +---+---+
| 2 | 3 | | 4 | 1 |
| 1 | 4 | | 2 | 3 |
+---+---+ +---+---+
我希望结果是:
+---+---+-----+
|id1|id2|label|
+---+---+-----+
| 2 | 3 | 1 |
| 1 | 4 | 0 |
+---+---+-----+
其中1表示链接存在于第二个数据帧中,而0表示相反。链接是定向的。您可以通过以下方式在两个数据帧之间进行左连接:
import org.apache.spark.sql.functions.when
import spark.implicits._
val df1 = sc.parallelize(Seq((2,3),(1,4))).toDF("id1","id2")
val df2 = sc.parallelize(Seq((4,1),(2,3))).toDF("id1","id2")
val df3 = df1.join(df2, df1("id1")===df2("id1") && df1("id2") === df2("id2"), "left")
.select(df1("id1"),
df1("id2"),
when(df2("id1").isNull, 0).otherwise(1).alias("label"))
df3.show()
+---+---+-----+
|id1|id2|label|
+---+---+-----+
| 2| 3| 1|
| 1| 4| 0|
+---+---+-----+
希望它能对您有所帮助。Hi@Valentina,欢迎来到StackOverflow,您可以查看以改进此问题和未来的问题。特别是你应该提供一些和/或一些代码,以证明你已经尝试自己解决问题。是的,这正是我所需要的。非常感谢你!