Spark:减去两个DataFrame

Int*_*tor 42 dataframe apache-spark rdd

在Spark版本1.2.0中,可以使用subtract2 SchemRDD秒来结束与第一个不同的内容

val onlyNewData = todaySchemaRDD.subtract(yesterdaySchemaRDD)
Run Code Online (Sandbox Code Playgroud)

onlyNewData包含todaySchemRDD不存在的行yesterdaySchemaRDD.

如何DataFrames在Spark 1.3.0版本中实现这一目标?

Eri*_*oom 69

根据api文档,做:

dataFrame1.except(dataFrame2)
Run Code Online (Sandbox Code Playgroud)

将返回一个新的DataFrame,其中包含dataFrame1中的行,但不包含dataframe2中的行.

  • @KatyaHandler你可以通过`LEFT ANTI`加入来做到这一点.`dataFrame1.join(dataFrame2,"key_col","left_anti")` (7认同)
  • @KatyaHandler您可以在连接的数据帧密钥上使用`LEFT JOIN`和`IS NULL`.sql就是这样的:`SELECT*FROM df1 LEFT JOIN df2 ON df1.id = df2.id WHERE df2.id IS NULL (6认同)
  • 如果我需要执行异常而不是整行,而只是一列,该怎么办?例如`dataFrame1`行除了`primary_key`没有出现在`dataFrame2`中的那些行?(看起来像RDD的`subtractByKey`,但最好是数据帧. (4认同)

小智 35

在pyspark DOCS中,它将被减去

df1.subtract(df2)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`subtract()`可用于Python Spark的数据帧,但Scala Spark的数据帧不存在该函数. (7认同)

Ric*_*c S 17

从 Spark 1.3.0 开始,您可以使用joinwith'left_anti'选项:

df1.join(df2, on='key_column', how='left_anti')
Run Code Online (Sandbox Code Playgroud)

这些是Pyspark API,但我猜 Scala 中也有相应的函数。


Art*_*ião 10

我试过减法,但结果不一致。如果我运行df1.subtract(df2),并非所有 df1 行都显示在结果数据框中,这可能是由于distinct在文档中引用的。

exceptAll 解决了我的问题: df1.exceptAll(df2)

  • Spark 2.4 版中的新功能。是的,但我认为它不适用于以前的版本!感谢分享。 (2认同)
  • 这只是 SQL 的一个原理:像减法、交集这样的集合操作就是:集合操作。因此,他们首先会将表转换为集合(其中没有重复的条目) (2认同)