2017-06-01 216 views
0

我有一個數組,其中包含一個可包含整數值的arraytype列。如果沒有值,它將只包含一個值,它將爲空值檢查arraytype列是否包含空值

重要:請注意,該列不會爲空,而是具有單個值的數組;空

> val df: DataFrame = Seq(("foo", Seq(Some(2), Some(3))), ("bar", Seq(None))).toDF("k", "v") 
df: org.apache.spark.sql.DataFrame = [k: string, v: array<int>] 
> df.show() 
+---+------+ 
| k|  v| 
+---+------+ 
|foo|[2, 3]| 
|bar|[null]| 

問題:我想獲得具有空值的行。

感謝您的幫助


我迄今爲止嘗試:

> df.filter(array_contains(df("v"), 2)).show() 
+---+------+ 
| k|  v| 
+---+------+ 
|foo|[2, 3]| 
+---+------+ 

爲空,它似乎並沒有工作

> df.filter(array_contains(df("v"), null)).show() 
org.apache.spark.sql.AnalysisException: cannot resolve 'array_contains(`v`, NULL)' due to data type mismatch: Null typed values cannot be used as arguments; 

> df.filter(array_contains(df("v"), None)).show() 
java.lang.RuntimeException: Unsupported literal type class scala.None$ None 
+0

什麼'df.filter(array_contains(DF( 「V」),NULL))顯示()'? '「null」'是一個字符串。 –

+0

這不會工作,因爲顯式檢查爲空。你會得到空類型的值不能用作參數 –

回答

3

在這種情況下不能使用array_contains,因爲無法比較SQL NULL的相等性。

您可以使用udf這樣的:

val contains_null = udf((xs: Seq[Integer]) => xs.contains(null)) 

df.where(contains_null($"v")).show 

// +---+------+ 
// | k|  v| 
// +---+------+ 
// |bar|[null]| 
+0

謝謝你的工作正確! (即使我認爲我不太喜歡udfs) –