Spark:减去两个 DataFrames

问题描述 投票:0回答:7

在 Spark 版本 1.2.0 中,可以使用

subtract
和 2 个
SchemRDD
最终仅得到与第一个不同的内容

val onlyNewData = todaySchemaRDD.subtract(yesterdaySchemaRDD)

onlyNewData
包含
todaySchemRDD
中不存在于
yesterdaySchemaRDD
中的行。

如何在 Spark 版本

1.3.0
中使用 DataFrames 来实现这一点?

dataframe apache-spark pyspark rdd
7个回答
106
投票

根据 Scala API 文档,做:

dataFrame1.except(dataFrame2)

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


75
投票

PySpark 中,它将是

subtract

df1.subtract(df2)

exceptAll
(如果需要保留重复项)

df1.exceptAll(df2)

17
投票

从 Spark 1.3.0 开始,您可以将

join
'left_anti'
选项一起使用:

df1.join(df2, on='key_column', how='left_anti')

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


13
投票

我尝试了减法,但结果不一致。 如果我运行

df1.subtract(df2)
,则 df1 的所有行都不会显示在结果数据框中,可能是由于文档中引用的
distinct

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


3
投票

对我来说,

df1.subtract(df2)
不一致。在一个数据帧上可以正常工作,但在另一个数据帧上则不行。那是因为重复。
df1.exceptAll(df2)
返回一个新的数据帧,其中包含 df1 中 df2 中不存在的记录,包括任何重复项。


1
投票

从 Spark 2.4.0 -

exceptAll

data_cl = reg_data.exceptAll(data_fr)

0
投票

Ric S 的答案是在如下情况下的最佳解决方案。

从 Spark 1.3.0 开始,您可以使用带有 'left_anti' 选项的连接:

df1.join(df2, on='key_column', how='left_anti')

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

这在某些情况下非常有用。认为。我有两个数据框

dataframe1
-----------------------------------------
|id | category                           |
-----------------------------------------
|1  | [{"type":"sport","name","soccer"}] |
-----------------------------------------
    
dataframe2
-----------------------------------------------------------------------------
|id | category                                                               |
-----------------------------------------------------------------------------
|1  | [{"type":"sport","name","soccer"}, {"type":"player","name":"ronaldo"}] |
-----------------------------------------------------------------------------

这里不能使用 exceptAll() 或 substract()

© www.soinside.com 2019 - 2024. All rights reserved.