小编Elm*_*cek的帖子

从空数组创建类型化数组列

我只想解决以下问题:我想过滤掉数据帧的所有元组,其中一列中包含的字符串不包含在黑名单中,该黑名单作为(可能为空)字符串数组给出。

例如:如果黑名单包含“四十二”和“二十三”,则从数据框中过滤掉相应列包含“四十二”或“二十三”的所有行。

以下代码将成功执行,如果blacklist不为空(例如 Array("fourty2"))而失败(Array.empty[String]):

//HELPERs
val containsStringUDF = udf(containsString(_: mutable.WrappedArray[String], _: String))
def containsString(array: mutable.WrappedArray[String], value: String) = {array.contains(value)}

def arrayCol[T](arr: Array[T]) = {array(arr map lit: _*)}

df.filter(!containsStringUDF(arrayCol[String](blacklist),$"theStringColumn"))
Run Code Online (Sandbox Code Playgroud)

错误信息是:

org.apache.spark.sql.AnalysisException: cannot resolve 'UDF(array(), theStringColumn)' due to data type mismatch: argument 1 requires array<string> type, however, 'array()' is of array<null> type
Run Code Online (Sandbox Code Playgroud)

看起来,空数组似乎没有类型可以触发。有没有好的方法来处理这个问题?

arrays apache-spark

3
推荐指数
1
解决办法
3049
查看次数

标签 统计

apache-spark ×1

arrays ×1