[英]How to filter nullable Array-Elements in Spark 1.6 UDF
考虑以下DataFrame
root
|-- values: array (nullable = true)
| |-- element: double (containsNull = true)
内容:
+-----------+
| values|
+-----------+
|[1.0, null]|
+-----------+
现在我想将value
列传递给UDF:
val inspect = udf((data:Seq[Double]) => {
data.foreach(println)
println()
data.foreach(d => println(d))
println()
data.foreach(d => println(d==null))
""
})
df.withColumn("dummy",inspect($"values"))
我确实对上面的println
语句的输出感到困惑:
1.0
null
1.0
0.0
false
false
我的问题:
foreach(println)
不能提供与foreach(d=>println(d))
相同的输出? Double
为空在第一的println语句,我认为Scala的Double
不能为空? Seq
过滤空值,而不是过滤0.0
,这不是真正的安全? 我应该使用Seq[java.lang.Double]
作为UDF中输入的类型,然后过滤null吗? (这有效,但是我不确定这是否可行) 请注意,我知道这个Question ,但是我的问题特定于数组类型的列。
为什么foreach(println)不能提供与foreach(d => println(d))相同的输出?
在需要Any
的上下文中,将完全跳过数据转换。 如果Int不能为null,则将对此进行详细说明。null.asInstanceOf [Int]是什么意思?
我以为scala的Double不能为null,所以在第一个println语句中Double怎么能为null?
内部二进制表示根本不使用Scala类型。 数组数据解码后,将表示为Array[Any]
并使用简单的asInstanceOf
将元素强制为已声明的类型。
我应该使用Seq [java.lang.Double]作为UDF中输入的类型,然后过滤null吗?
通常,如果值可以为空,那么您应该使用也可以为空的外部类型或Option
。 不幸的是,只有第一个选项适用于UDF。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.