2017-06-01 226 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) –