Joe*_*787 3 sql null scala apache-spark apache-spark-sql
我正在使用Spark(Scala)进行质量检查数据移动-将表从一个关系数据库移动到另一个关系数据库。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")
Run Code Online (Sandbox Code Playgroud)
我使用以下逻辑来查找不匹配项:
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((_||_)))
Run Code Online (Sandbox Code Playgroud)
但是,如果完整外部联接的一侧缺少键:
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")
Run Code Online (Sandbox Code Playgroud)
将不会出现在不匹配的DF数据集中。
所以我的问题是:=!=运算符与运算符相反<=>吗?似乎不是,因此是否有一个运算符将针对这种情况返回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"))
Run Code Online (Sandbox Code Playgroud)
要么
df.select(!($"x" <=> $"y"))
Run Code Online (Sandbox Code Playgroud)
要么
df.selectExpr("x IS DISTINCT FROM y")
Run Code Online (Sandbox Code Playgroud)
全部给出相同的结果:
import org.apache.spark.sql.not
val df = Seq(("foo", null), ("foo", "bar"), ("foo", "foo")).toDF("x", "y")
df.select(not($"x" <=> $"y"))
Run Code Online (Sandbox Code Playgroud)
当然,如果您有否定的取舍:
(NOT P) OR (NOT Q)
Run Code Online (Sandbox Code Playgroud)
您可以随时使用De Morgan的定律将其重写为对合取的否定
NOT(P AND Q)
Run Code Online (Sandbox Code Playgroud)
因此:
not(joinColumns.foldLeft(lit(true))(_ and _))
Run Code Online (Sandbox Code Playgroud)
应该工作正常。
| 归档时间: |
|
| 查看次数: |
3559 次 |
| 最近记录: |