我有父数据帧,假设有 10 个 ID,该数据帧的子集有 4 个 ID,如何识别子集数据帧中不存在的剩余 6 个 ID。我不想对输入运行任何 foreach 循环,因为输入可能包含数百万条记录。
Parent DataFrame :
id
1
2
3
4
5
SubsetDataFrame
id
1
2
3
所需输出为
id
4
5
这就是你想要做的。
val parentDf = Seq(Tuple1(1), Tuple1(2), Tuple1(3), Tuple1(4), Tuple1(5)).toDF("id")
val subsetDf = Seq(Tuple1(1), Tuple1(2), Tuple1(3)).toDF("id")
val antiJoined = parentDf.join(
subsetDf.withColumnRenamed("l_id"),
$"id" === $"l_id",
"left_outer"
).filter($"l_id".isNull).drop("l_id")
antiJoined.show
+---+
| id|
+---+
| 4|
| 5|
+---+
请注意,由于subsetDf
是parentDf
的子集,因此您只需要一个left_outer
。如果要查找连接任一侧缺少的元素(即较大超集的子集的两个DataFrames
where 子集,并且您想查找子集中另一个子集中不存在的元素),则可以改用full_outer
。
我想最简单的方法是使用 左半连接
case class D(id: Int, value: String)
val df1 = sqlContext.createDataFrame(Seq(D(1, "a"), D(2, "b"), D(3, "c")))
val df2 = sqlContext.createDataFrame(Seq(D(1, "a")))
df1.registerTempTable("table1")
df2.registerTempTable("table2")
sqlContext.sql("select * from table1 t1 left semi join table2 t2 on (t1.id != t2.id)").show()
+---+-----+
| id|value|
+---+-----+
| 2| b|
| 3| c|
+---+-----+