Spark:减去两个DataFrame
Posted
技术标签:
【中文标题】Spark:减去两个DataFrame【英文标题】:Spark: subtract two DataFrames 【发布时间】:2015-06-14 18:19:44 【问题描述】:在 Spark 版本 1.2.0 中,可以使用 subtract
和 2 个 SchemRDD
s 来结束与第一个不同的内容
val onlyNewData = todaySchemaRDD.subtract(yesterdaySchemaRDD)
onlyNewData
包含todaySchemRDD
中不存在于yesterdaySchemaRDD
中的行。
如何在 Spark 版本 1.3.0 中使用 DataFrames
实现这一点?
【问题讨论】:
【参考方案1】:从 Spark 1.3.0 开始,您可以使用 join
和 'left_anti'
选项:
df1.join(df2, on='key_column', how='left_anti')
这些是 Pyspark API,但我猜 Scala 中也有对应的函数。
【讨论】:
【参考方案2】:根据Scala API docs,做:
dataFrame1.except(dataFrame2)
将返回一个新的 DataFrame,其中包含 dataFrame1 中的行,但不包含 dataframe2 中的行。
【讨论】:
如果我需要对整行而不是一列执行异常怎么办?例如。dataFrame1
行,除了那些primary_key
没有出现在dataFrame2
中的行? (对于 RDD,看起来像 subtractByKey
,但最好是对于数据帧。
@KatyaHandler 您可以在加入的数据框的键上使用LEFT JOIN
和IS NULL
。用于此的 sql 类似于:SELECT * FROM df1 LEFT JOIN df2 ON df1.id = df2.id WHERE df2.id IS NULL
@KatyaHandler:我也在寻找相同的解决方案..你能告诉我你是如何使用 DF 实现这一目标的吗,你能更新答案吗?
@KatyaHandler 你可以通过LEFT ANTI
加入来做到这一点。 dataFrame1.join(dataFrame2, "key_col", "left_anti")
Pyspark 中有实现吗?【参考方案3】:
在 PySpark 中是 subtract
df1.subtract(df2)
或exceptAll
,如果需要保留重复项
df1.exceptAll(df2)
【讨论】:
这是之前某些版本的正确答案。绝对适用于 2.1.0。 嘿@Teja 减法似乎区分大小写。减法时是否可以忽略大小写 请注意,subtract()
可用于 Python Spark 的数据帧,但该函数不适用于 Scala Spark 的数据帧。
据我了解,subtract() 与“左反”连接相同,其中连接条件是每一列,并且两个数据帧具有相同的列。【参考方案4】:
我试过减法,但结果不一致。
如果我运行 df1.subtract(df2)
,则并非所有 df1 行都显示在结果数据框中,可能是由于文档中引用的 distinct
。
exceptAll
解决了我的问题:
df1.exceptAll(df2)
【讨论】:
Spark 2.4 版中的新功能。是的,但我认为它不适用于以前的版本!感谢分享。 你可以在版本 2+ 中复制它DataFrame(df1._jdf.exceptAll(df2._jdf), sqlContext)
这只是SQL的一个原理:减法、相交等集合操作就是:集合操作。因此,他们将首先将表转换为集合(没有重复条目)
@BdEngineer ,在文档中找不到除了函数,是 PySpark 还是 Spark Scala? (spark.apache.org/docs/latest/api/python/…)
@ArthurJulião 对于 pyspark 使用 subtract
。 spark.apache.org/docs/latest/api/python/…【参考方案5】:
来自 Spark 2.4.0 - exceptAll
data_cl = reg_data.exceptAll(data_fr)
【讨论】:
【参考方案6】:对我来说,df1.subtract(df2)
是不一致的。在一个数据帧上正常工作,但在另一个数据帧上不能正常工作。那是因为重复。 df1.exceptAll(df2)
返回一个新数据框,其中包含 df1 中不存在于 df2 中的记录,包括任何重复项。
【讨论】:
以上是关于Spark:减去两个DataFrame的主要内容,如果未能解决你的问题,请参考以下文章
为啥 spark 中的 sample 和减去方法会给出这样的结果