[英]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.