在 Spark 版本 1.2.0 中,可以使用
subtract
和 2 个 SchemRDD
最终仅得到与第一个不同的内容
val onlyNewData = todaySchemaRDD.subtract(yesterdaySchemaRDD)
onlyNewData
包含 todaySchemRDD
中不存在于 yesterdaySchemaRDD
中的行。
如何在 Spark 版本
1.3.0中使用
DataFrames
来实现这一点?
根据 Scala API 文档,做:
dataFrame1.except(dataFrame2)
将返回一个新的DataFrame,其中包含dataFrame1中的行,但不包含dataframe2中的行。
join
与 'left_anti'
选项一起使用:
df1.join(df2, on='key_column', how='left_anti')
这些是Pyspark API,但我猜Scala中也有对应的函数。
我尝试了减法,但结果不一致。 如果我运行
df1.subtract(df2)
,则 df1 的所有行都不会显示在结果数据框中,可能是由于文档中引用的 distinct
。
exceptAll
解决了我的问题:
df1.exceptAll(df2)
对我来说,
df1.subtract(df2)
不一致。在一个数据帧上可以正常工作,但在另一个数据帧上则不行。那是因为重复。 df1.exceptAll(df2)
返回一个新的数据帧,其中包含 df1 中 df2 中不存在的记录,包括任何重复项。
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()