Scala 检查arraytype列是否包含null

Scala 检查arraytype列是否包含null,scala,apache-spark,dataframe,null,apache-spark-sql,Scala,Apache Spark,Dataframe,Null,Apache Spark Sql,我有一个dataframe,它的arraytype列可以包含整数值。如果没有值,它将只包含一个值,它将是空值 重要信息:注意该列不是空的,而是一个具有单个值的数组;空的 > val df: DataFrame = Seq(("foo", Seq(Some(2), Some(3))), ("bar", Seq(None))).toDF("k", "v") df: org.apache.spark.sql.Dat

我有一个dataframe,它的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]|
对于null,它似乎不起作用

> df.filter(array_contains(df("v"), null)).show()
org.apache.spark.sql.AnalysisException:无法解析 由于数据类型不匹配,“数组_包含(
v
,NULL)”:NULL类型 值不能用作参数

java.lang.RuntimeException:不支持的文本类型类scala.None$ 没有


在这种情况下不能使用
array\u contains
,因为无法比较SQL
NULL
是否相等

您可以像这样使用
udf

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

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

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

对于Spark 2.4+,您可以使用高阶函数代替UDF:

df.where(“存在(v,x->x为空)”).show
//+---+---+
//|k|v|
//+---+---+
//|巴|
//+---+---+
> df.filter(array_contains(df("v"), None)).show()
val contains_null = udf((xs: Seq[Integer]) => xs.contains(null))

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

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