Spark:减去两个DataFrame

Posted

技术标签:

【中文标题】Spark:减去两个DataFrame【英文标题】:Spark: subtract two DataFrames 【发布时间】:2015-06-14 18:19:44 【问题描述】:

在 Spark 版本 1.2.0 中,可以使用 subtract 和 2 个 SchemRDDs 来结束与第一个不同的内容

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 JOINIS 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 Dataframe 除了方法问题

Apache Spark 从时间戳列中减去天数

为啥 spark 中的 sample 和减去方法会给出这样的结果

Spark - HiveContext |错误的时间戳(减去 4 小时)

减去日期并连接字符串 - spark SQL

漫画全面解释Spark企业调优点