2016-12-02 89 views
1

只想解决以下问题:我要过滤掉,其中包含在一个列中的串的数据帧的所有元组不包含在其被给定为一个黑名单一个(可能是空的)字符串数组。例如:如果黑名单包含“四十二”和“二十三”,则将所有行从其中相应列包含“四十二”或“二十三”的数据帧中过滤出来。创建从一个空数组类型化的阵列列

下面的代码将成功地执行,如果blacklist不为空(例如阵列(“四十2”))和其他失败(Array.empty [字符串]):

//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")) 

该错误消息是:

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 

看起来,空阵列看起来没有类型的火花。有没有很好的方法来处理这个问题?

+0

所以黑名单是一个数组?其实I4m不是很确定你想要做什么 – eliasah

+0

是的,eliasah。它包含我不想在列“theStringColumn”中出现的字符串。 –

+0

你能举个例子吗? (输入,黑名单和预期输出) – eliasah

回答

1

你是一个得太多问题。你真正需要的是在这里isin

val blacklist = Seq("foo", "bar") 

$"theStringColumn".isin(blacklist: _*) 

而且不依赖于本地类型ArrayType是一个WrappedArray。只需使用Seq即可。

最后回答你的问题,你可以:

array().cast("array<string>") 

或:

import org.apache.spark.sql.types.{ArrayType, StringType} 

array().cast(ArrayType(StringType)) 
+0

谢谢!我正在寻找的解决方案是铸造。不知何故,我错过了。同时感谢您使用Seq的提示。我会尝试。 –