识别父数据帧中不存在于java子集数据帧中的记录

Posted

技术标签:

【中文标题】识别父数据帧中不存在于java子集数据帧中的记录【英文标题】:identify records in parent dataframe which are not present in subset dataframe in java 【发布时间】:2016-04-22 09:30:06 【问题描述】:

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

Parent DataFrame :
id
 1
 2
 3
 4
 5

SubsetDataFrame
 id
  1
  2
  3

要求的输出是

 id
  4
  5

【问题讨论】:

外连接,过滤掉非空值。或转换为 RDD 并使用 subtractByKey full-outer join the stream并过滤掉结果集两边都没有的那些。 这是一个DataFrame,不会有None,只有null 值。 【参考方案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 都是较大超集的子集,并且您想在另一个子集中不存在的子集中查找元素),那么您将使用full_outer .

【讨论】:

【参考方案2】:

我想最简单的方法是使用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|
+---+-----+

【讨论】:

以上是关于识别父数据帧中不存在于java子集数据帧中的记录的主要内容,如果未能解决你的问题,请参考以下文章

基于分组数据帧中的两个条件的子集

仅在列存在时才提供数据框列表

通过在两个 Pandas 数据帧之间迭代来识别相似的值。

仅当列存在时才适用于数据框列表

根据 CSV 记录从 Spark 数据帧中过滤一些数据

从 R 中的整个数据帧中删除空格