Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 未找到价值&&;在spark数据帧中:在比较空值时_Scala_Apache Spark_Spark Streaming - Fatal编程技术网

Scala 未找到价值&&;在spark数据帧中:在比较空值时

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和df2,我基于id列连接这两个数据帧,然后创建一个新列作为结果,并检查以下测试条件。 1.如果两种情况下的名称相同,则需要设置为Y。 但如果任何数据帧中都有null,或者两个列中都有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       |
+----+----+---------+-----------+