识别父数据帧中的记录,这些记录在java

时间:2016-04-22 09:30:06

标签: java scala apache-spark dataframe apache-spark-sql

我有父数据帧,假设有10个ID,该数据帧的子集有4个ID,如何识别子集数据帧中不存在的剩余6个ID。我不想在输入上运行任何foreach循环,因为输入可能包含数百万条记录。

Parent DataFrame :
id
 1
 2
 3
 4
 5

SubsetDataFrame
 id
  1
  2
  3

必需输出

 id
  4
  5

2 个答案:

答案 0 :(得分:1)

这就是你想要做的。

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|
+---+

请注意,由于subsetDfparentDf的子集,因此您只需要left_outer。如果你想在连接的任何一侧找到缺少的元素(即DataFrames和更大的超集的子集,并且你想要找到子集中不存在于另一个子集中的元素)那么你会使用{{ 1}}而不是。

答案 1 :(得分:0)

我想最简单的方法是使用 LEFT SEMI JOIN

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|
+---+-----+