首页 > 解决方案 > 移至 spark 3.0.1 后,“除外”功能无法按预期工作

问题描述

我最近从 spark 2.4 迁移到 spark 3.0.1,之后,我面临一个问题,即“除外”功能无法按预期工作。这是我正在使用的两个数据帧的输出 -

expected_df.show(false)
+--------+------------------------------------+
|duration|regardingobjectid                   |
+--------+------------------------------------+
|1730.0  |9cd27e8e-061d-435b-89bf-a0ad2c2b11f3|
|1142.5  |509c2aaf-75a7-492d-9a71-35d207617097|
|1082.5  |a75eb211-de50-429f-bc16-1778938701cb|
|1127.5  |9457eb9e-f207-4ba6-a268-eb6b3a4d268d|
|1400.0  |8506bd67-9e00-440b-9b36-ffbbf4472c15|
|7.5     |568b9d9b-a4ac-4dee-80b2-9db989d9f9e4|
+--------+------------------------------------+

actual_df.show(false)
+--------+------------------------------------+
|duration|regardingobjectid                   |
+--------+------------------------------------+
|1082.5  |a75eb211-de50-429f-bc16-1778938701cb|
|1127.5  |9457eb9e-f207-4ba6-a268-eb6b3a4d268d|
|1142.5  |509c2aaf-75a7-492d-9a71-35d207617097|
|1400.0  |8506bd67-9e00-440b-9b36-ffbbf4472c15|
|7.5     |568b9d9b-a4ac-4dee-80b2-9db989d9f9e4|
|1730.0  |9cd27e8e-061d-435b-89bf-a0ad2c2b11f3|
+--------+------------------------------------+

从上面的输出可以看出,上述数据帧中的数据是相同的。当我使用 except 函数来查找这些数据帧之间的差异时,这是我得到的输出 -

actual_df.except(expected_df).show(false)
+--------+-----------------+
|duration|regardingobjectid|
+--------+-----------------+
+--------+-----------------+

expected_df.except(actual_df).show(false)
+--------+------------------------------------+
|duration|regardingobjectid                   |
+--------+------------------------------------+
|1082.5  |a75eb211-de50-429f-bc16-1778938701cb|
|1127.5  |9457eb9e-f207-4ba6-a268-eb6b3a4d268d|
|1142.5  |509c2aaf-75a7-492d-9a71-35d207617097|
|1400.0  |8506bd67-9e00-440b-9b36-ffbbf4472c15|
|1730.0  |9cd27e8e-061d-435b-89bf-a0ad2c2b11f3|
+--------+------------------------------------+

在第一种情况下,except 的输出正确地为空,但在第二种情况下,它只删除一行并保留其他行。

相同的代码在 Spark 2.4 上运行得非常好。

我使用“printSchema”验证了两个数据帧的数据类型相同。

还验证了当我将上述数据帧转换为 RDD 时,减法方法工作正常。

关于“除外”功能是否有行为变化,我可能在这里遗漏了?

标签: scalaapache-spark

解决方案


推荐阅读