gpt4 book ai didi

scala - 在 Spark SQL 中将数组作为 UDF 参数传递

转载 作者:行者123 更新时间:2023-12-02 22:38:31 25 4
gpt4 key购买 nike

我正在尝试通过一个以数组作为参数的函数来转换数据帧。我的代码看起来像这样:

def getCategory(categories:Array[String], input:String): String = { 
categories(input.toInt)
}

val myArray = Array("a", "b", "c")

val myCategories =udf(getCategory _ )

val df = sqlContext.parquetFile("myfile.parquet)

val df1 = df.withColumn("newCategory", myCategories(lit(myArray), col("myInput"))

但是,lit 不喜欢数组,并且此脚本错误。我尝试定义一个新的部分应用函数,然后定义 udf:

val newFunc = getCategory(myArray,  _:String) 
val myCategories = udf(newFunc)

val df1 = df.withColumn("newCategory", myCategories(col("myInput")))

这也不起作用,因为我收到 nullPointer 异常,并且似乎 myArray 未被识别。关于如何将数组作为参数传递给带有数据帧的函数有什么想法吗?

另外,有什么解释可以解释为什么做一些简单的事情(比如在数据帧上使用函数)如此复杂(定义函数、将其重新定义为 UDF 等)?

最佳答案

很可能不是最漂亮的解决方案,但你可以尝试这样的方法:

def getCategory(categories: Array[String]) = {
udf((input:String) => categories(input.toInt))
}

df.withColumn("newCategory", getCategory(myArray)(col("myInput")))

您还可以尝试使用文字数组:

val getCategory = udf(
(input:String, categories: Array[String]) => categories(input.toInt))

df.withColumn(
"newCategory", getCategory($"myInput", array(myArray.map(lit(_)): _*)))

顺便说一句,使用 Map 而不是 Array 可能是一个更好的主意:

def mapCategory(categories: Map[String, String], default: String) = {
udf((input:String) => categories.getOrElse(input, default))
}

val myMap = Map[String, String]("1" -> "a", "2" -> "b", "3" -> "c")

df.withColumn("newCategory", mapCategory(myMap, "foo")(col("myInput")))

从 Spark 1.5.0 开始,您还可以使用 array 函数:

import org.apache.spark.sql.functions.array

val colArray = array(myArray map(lit _): _*)
myCategories(lit(colArray), col("myInput"))

另请参阅Spark UDF with varargs

关于scala - 在 Spark SQL 中将数组作为 UDF 参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31036567/

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