gpt4 book ai didi

sql - Spark/Scala - 当一列为 NULL 时比较数据框中的两列

转载 作者:行者123 更新时间:2023-12-01 11:18:32 26 4
gpt4 key购买 nike

我正在使用 Spark (Scala) 进行 QA 数据移动 - 将表从一个关系数据库移动到另一个。 QA 过程涉及在源表和目标表之间执行完整的外部联接。

源表和目标表在一个或多个键上的数据框中连接:

val joinColumns = for (i <- 0 to (sourceJoinFields.length - 1)) yield sourceDF.col(sourceJoinFields(i)) <=> targetDF.col(targetJoinFields(i))
val joinedDF = sourceDF.join(targetDF, joinColumns.reduce((_&&_)), "fullouter")

我正在使用以下逻辑来查找不匹配:
val mismatchColumns = for (i <- 0 to (sourceDF.columns.length-1)) yield (joinedDF.col(joinedDF.columns(i)) =!= joinedDF.col(joinedDF.columns(i+(sourceDF.columns.length))))
val mismatchedDF = joinedDF.filter(mismatchColumns.reduce((_||_)))

但是,如果全外连接的一侧缺少键:

+--------------+--------------+--------------+--------------+
|source_key |source_field |target_key |target_field |
+--------------+--------------+--------------+--------------+
|null |null |XXX |XXX |

不会出现在 mismatchedDF 数据集中。

所以我的问题:是 =!=运算符与 <=> 相反运算符(operator)?它似乎不是,那么是否有一个运算符会在这种情况下返回 FALSE?我找不到关于任一运营商的太多文档。

最佳答案

IS NOT DISTINCT FROM相反( <=> ) 是 IS DISTINCT FROM ( not(... <=> ...) )。

import org.apache.spark.sql.not

val df = Seq(("foo", null), ("foo", "bar"), ("foo", "foo")).toDF("x", "y")
df.select(not($"x" <=> $"y"))

或者
df.select(!($"x" <=> $"y"))

或者
df.selectExpr("x IS DISTINCT FROM y")

都给出相同的结果:

+---------------+
|(NOT (x <=> y))|
+---------------+
| true|
| true|
| false|
+---------------+

当然,如果你有否定的分离:
(NOT P) OR (NOT Q)

您总是可以使用德摩根定律将其重写为对连词的否定
NOT(P AND Q)

所以:
not(joinColumns.foldLeft(lit(true))(_ and _))

应该工作得很好。

关于sql - Spark/Scala - 当一列为 NULL 时比较数据框中的两列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47167916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com