簡體   English   中英

如何在Spark 1.6 UDF中過濾可為空的數組元素

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

我的問題:

  1. 為什么foreach(println)不能提供與foreach(d=>println(d))相同的輸出?
  2. 該如何Double為空在第一的println語句,我認為Scala的Double不能為空?
  3. 如何在我的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM