当前位置: 首页 > 知识库问答 >
问题:

Scala:可变UDF

胡鸿禧
2023-03-14

我有一个包含许多列的数据框架。我也有一个功能

def getFeatureVector(features:Array[String]) : Vector

这相当复杂,但需要一些字符串并返回一个火花MLlib向量。

现在,我想查看DF中的一些列(我事先不知道是哪一列),将它们传递给getFeatureVector,并添加一个包含结果向量的新列。

我可以访问我想要使用的列的数组,我写了一个函数将它转换为string,并生成一个数组列:

val colNamesToEncode = Array("col1", "col2", "col3", "col4")
def getColsToEncode:Column = {
    val cols = colNamesToEncode.map(x => col(x).cast("string"))
    array(cols:_*)
}

最后,我尝试制作一个udf并将其应用于df:

val encoderUDF = udf(getFeatureVector _)
val cols = getColsToEncode()
data.withColumn(featuresColName,encoderUDF(cols))

但是当我运行它时,我得到java.lang.RuntimeException:不支持的文字类型类scala.runtime.BoxedUnit()

如何将函数应用于DF?

PS:我在写代码的时候用这个答案(Spark UDF和varargs)作为指导。

共有2个答案

邴奇逸
2023-03-14

您可以直接将函数传递到 udf 函数中。

val colNamesToEncode = Array("col1", "col2", "col3", "col4")
def getColsToEncode:Column = {
val cols = colNamesToEncode.map(x => col(x).cast("string"))
array(cols:_*)
}

val encoderUDF = udf(getFeatureVector _)
data.withColumn(featuresColName,encoderUDF(getColsToEncode))
董子航
2023-03-14

只需从下面的行中删除(),即可解决错误。

val cols = getColsToEncode()

val cols = getColsToEncode
 类似资料:
  • Scala 函数 Scala 允许你指明函数的最后一个参数可以是重复的,即我们不需要指定函数参数的个数,可以向函数传入可变长度参数列表。 Scala 通过在参数的类型之后放一个星号来设置可变参数(可重复的参数)。例如: object Test { def main(args: Array[String]) { printStrings("Runoob", "Scala",

  • 我试图运行一个简单的字数计数程序与和得到一个例外。 异常线程"main"java.lang.BootstrapMultiodError:java.lang.NoClassDefFoundError: scala/集合/可变/ArraySeq$ofRef at SparkWordCount$. main(SparkWordCount.scala:18) 从第18行开始的代码是 我的环境: Windo

  • 主要内容:变量声明,变量类型声明,变量类型引用,Scala 多个变量声明变量是一种使用方便的占位符,用于引用计算机内存地址,变量创建后会占用一定的内存空间。 基于变量的数据类型,操作系统会进行内存分配并且决定什么将被储存在保留内存中。因此,通过给变量分配不同的数据类型,你可以在这些变量中存储整数,小数或者字母。 变量声明 在学习如何声明变量与常量之前,我们先来了解一些变量与常量。 一、变量: 在程序运行过程中其值可能发生改变的量叫做变量。如:时间,年龄。 二、常量 在

  • 变量是一种使用方便的占位符,用于引用计算机内存地址,变量创建后会占用一定的内存空间。 基于变量的数据类型,操作系统会进行内存分配并且决定什么将被储存在保留内存中。因此,通过给变量分配不同的数据类型,你可以在这些变量中存储整数,小数或者字母。 变量声明 在学习如何声明变量与常量之前,我们先来了解一些变量与常量。 一、变量: 在程序运行过程中其值可能发生改变的量叫做变量。如:时间,年龄。 二、常量 在

  • 本文向大家介绍Scala案例分类和不可变性,包括了Scala案例分类和不可变性的使用技巧和注意事项,需要的朋友参考一下 示例 Scala编译器默认在参数列表中为每个参数加上前缀val。这意味着,默认情况下,案例类是不可变的。每个参数都具有一个访问器方法,但是没有可变器方法。例如: 在案例类中将参数声明为var会覆盖默认行为,并使案例类可变: 案例类为“可变”的另一个实例是案例类中的值是可变的: 请

  • 我是Scala的新手。我在想整个逆变关系是如何运作的。我了解协方差和不变量的概念,我也知道如何在实践中实现它们。我还理解了逆变(协方差的反向)的概念,以及它是如何在Scala中的Function1特性中实现的。它为您提供了一种抽象,而无需为不同的类重新定义Function1实现。但是,我还是不完全明白,奇怪吗?现在,我就快到了…我如何用逆变来解决下面的问题: 上面的例子摘自http://blog.