Spark Java Exception method vs.leftanti join返回不一致的结果,可能存在错误?

Spark Java Exception method vs.leftanti join返回不一致的结果,可能存在错误?,java,apache-spark,apache-spark-sql,Java,Apache Spark,Apache Spark Sql,我在Spark dataframes Java API中遇到了一个bug。我用的是spark 2.3.1。我已经挠头好几天了,我不明白为什么使用except和leftanti过滤不需要的数据的两种方法的结果会不同 似乎except函数实际上是一个except distinct!调用except的数据帧将删除所有重复的数据帧 只是想提供这些信息,以防其他人遇到同样的问题!运行except函数会在生成的数据帧中生成唯一的数据。要保留原始数据,请确保使用leftanti 似乎.except()作为的不

我在Spark dataframes Java API中遇到了一个bug。我用的是spark 2.3.1。我已经挠头好几天了,我不明白为什么使用except和leftanti过滤不需要的数据的两种方法的结果会不同

似乎except函数实际上是一个except distinct!调用except的数据帧将删除所有重复的数据帧

只是想提供这些信息,以防其他人遇到同样的问题!运行except函数会在生成的数据帧中生成唯一的数据。要保留原始数据,请确保使用leftanti

似乎
.except()
作为的
不同的
操作。前面提到的
除外
的文档是不正确的,因为行为总是
除外

如果您比较
leftanti

== Physical Plan ==
*BroadcastHashJoin [value#1], [value#4], LeftAnti, BuildRight
:- LocalTableScan [value#1]
+- BroadcastExchange HashedRelationBroadcastMode(List(input[0, string, true]))
   +- LocalTableScan [value#4]
以及
except()

==物理计划==
*HashAggregate(键=[值#1],函数=[])
+-交换哈希分区(值#1200)
+-*HashAggregate(键=[值#1],函数=[])
+-*BroadcastHashJoin[coalesce(值#1,)],[coalesce(值#4,)],LeftAnti,BuildRight,(值#1值#4)
:-LocalTableScan[值#1]
+-BroadcastExchange HashedRelationBroadcastMode(列表(合并(输入[0,字符串,true],))
+-LocalTableScan[value#4]

您可以看到,还有一个额外的
HashAggregate
步骤可以删除重复项。

您说得对!我测试了这个。except函数实际上从最终数据帧中删除所有重复项!
== Physical Plan ==
*HashAggregate(keys=[value#1], functions=[])
+- Exchange hashpartitioning(value#1, 200)
   +- *HashAggregate(keys=[value#1], functions=[])
      +- *BroadcastHashJoin [coalesce(value#1, )], [coalesce(value#4, )], LeftAnti, BuildRight, (value#1 <=> value#4)
         :- LocalTableScan [value#1]
         +- BroadcastExchange HashedRelationBroadcastMode(List(coalesce(input[0, string, true], )))
            +- LocalTableScan [value#4]