Scala 未找到价值&&;在spark数据帧中:在比较空值时
嗨,我有两个数据帧df1和df2,我基于id列连接这两个数据帧,然后创建一个新列作为结果,并检查以下测试条件。 1.如果两种情况下的名称相同,则需要设置为Y。 但如果任何数据帧中都有null,或者两个列中都有null,则表示不匹配。我想如果两个数据帧中都有null,那么它应该被视为匹配的,所以我添加了以下条件Scala 未找到价值&&;在spark数据帧中:在比较空值时,scala,apache-spark,spark-streaming,Scala,Apache Spark,Spark Streaming,嗨,我有两个数据帧df1和df2,我基于id列连接这两个数据帧,然后创建一个新列作为结果,并检查以下测试条件。 1.如果两种情况下的名称相同,则需要设置为Y。 但如果任何数据帧中都有null,或者两个列中都有null,则表示不匹配。我想如果两个数据帧中都有null,那么它应该被视为匹配的,所以我添加了以下条件 ||(df1("name") is null && df2("name") is null 因此,如果两个列都为null,那么它应该打印为匹配,但显示“未找到值
||(df1("name") is null && df2("name") is null
因此,如果两个列都为null,那么它应该打印为匹配,但显示“未找到值”&&“。我正在写下面的代码。有人能建议我该如何实施这一点吗
df1.join(df2,df2("id") === df2("id"))
.withColumn("Result", when(df1("name") === df2("name") ||
(df1("name") is null &&
(df2("name") is null," matched"))
.otherwise(" Not Matched"))
您忘记在匹配的值之前添加)
试试下面的代码
df1.join(df2,df2("id") === df2("id"))
.withColumn("Result", when((df1("name") === df2("name") || (df1("name").isNull && df2("name").isNull)),"matched").otherwise(" Not Matched"))
为什么要将来自df2的同一列放入联接条件中?由于两个数据帧上的列名相同,因此可以将列名置于联接条件中。 你能试着换一下密码吗- 你的代码-
df1.join(df2,df2("id") === df2("id"))
.withColumn("Result", when(df1("name") === df2("name") ||
(df1("name") is null &&
(df2("name") is null," matched"))
.otherwise(" Not Matched"))
改为-
df2(“id”)==df2(“id”)到“id”
还没有测试过,但它应该可以工作。df1(“name”)为null
不是您需要的函数,is
是scala中任何对象的方法,您正在寻找将返回列引用类的df1(“name”)isNull
,该类将具有&
方法
但是看看代码,我建议使用空安全运算符作为
。在您的情况下,它将简化您的逻辑:
val NullVal = null.asInstanceOf[String]
List(
("hi" , "hi"),
(NullVal, "hi"),
(NullVal, NullVal)
).toDF("c1","c2")
.select($"c1", $"c2", $"c1" === $"c2", $"c1" <=> $"c2")
.show(false)
val NullVal=null.asInstanceOf[String]
名单(
("嗨","嗨"),,
(NullVal,“hi”),
(NullVal,NullVal)
).toDF(“c1”、“c2”)
。选择($“c1”、$“c2”、$“c1”==$“c2”、$“c1”$“c2”)
.show(假)
结果将是
+----+----+---------+-----------+
|c1 |c2 |(c1 = c2)|(c1 <=> c2)|
+----+----+---------+-----------+
|hi |hi |true |true |
|null|hi |null |false |
|null|null|null |true |
+----+----+---------+-----------+
+----+----+---------+-----------+
|c1 | c2 |(c1=c2)|(c1 c2)|
+----+----+---------+-----------+
|嗨|嗨|真|真|
|空|嗨|空|假|
|空|空|空|真|
+----+----+---------+-----------+
您有错误的方括号,为空
应替换为.isNull:.withColumn(“结果”,当(表(“名称”)===表(“名称”)|(表(“名称”).isNull&&table(“名称”).isNull,“匹配”)。否则(“不匹配”)
无法解析“(名称
为空)和名称
)'由于数据类型不匹配:'(name
为空)和name
)'中的类型不同(布尔值和字符串)。我试过了,但犯了这个错误。
+----+----+---------+-----------+
|c1 |c2 |(c1 = c2)|(c1 <=> c2)|
+----+----+---------+-----------+
|hi |hi |true |true |
|null|hi |null |false |
|null|null|null |true |
+----+----+---------+-----------+