gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:40:55 25 4
gpt4 key购买 nike

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

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

如果黑名单不为空(例如Array("fourtytwo")),则以下代码将成功执行,否则失败(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"))

错误信息是:

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

看来,空数组对于 Spark 来说似乎是无类型的。有没有好的方法来处理这个问题?

最佳答案

你想太多了。你真正需要的是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))

关于arrays - 从空数组创建类型化数组列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40929096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com