【问题标题】:Creating a typed array column from an empty array从空数组创建类型化数组列
【发布时间】:2016-12-02 20:18:39
【问题描述】:

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

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

如果blacklist不为空(例如Array(“四十二”)),则以下代码将成功执行,否则失败(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

看起来,空数组似乎是无类型的。有什么好的方法来解决这个问题吗?

【问题讨论】:

  • 所以黑名单是一个数组?实际上,我不太确定您要做什么
  • 是的,以利亚。它包含我不希望在“theStringColumn”列中出现的字符串。
  • 你能举个例子吗? (输入、黑名单和预期输出)
  • 当然,我加了一个例子。

标签: arrays apache-spark


【解决方案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))

【讨论】:

  • 谢谢!我正在寻找的解决方案是铸造。不知怎的,我错过了。还要感谢您提供有关使用 Seq 的提示。我会试试的。
猜你喜欢
  • 1970-01-01
  • 2022-06-22
  • 2013-09-14
  • 2018-03-06
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 2019-05-19
相关资源
最近更新 更多