Scala udf UnsupportedOperationException

Posted

技术标签:

【中文标题】Scala udf UnsupportedOperationException【英文标题】: 【发布时间】:2020-12-03 01:03:43 【问题描述】:

我有一个用 scala 编写的数据框 a2:

val a3 = a2.select(printme.apply(col(“PlayerReference”)))

PlayerReference 列包含一个字符串。

调用 udf 函数:

val printme = udf(
      st: String =>
        val x = new JustPrint(st)
        x.printMe();
        
    )

这个 udf 函数调用一个 java 类:

public class JustPrint 
    private String ss = null;
    
    public JustPrint(String ss) 
        this.ss = ss;
    
    
    public void printMe() 
        System.out.println("Value : " + this.ss);
    

但我对 udf 有此错误:

java.lang.UnsupportedOperationException: Schema for type Unit is not supported

本练习的目标是验证调用链。 我应该怎么做才能解决这个问题?

【问题讨论】:

您的 UDF 返回 Unit 方法 printMe() 具有 void 返回类型,即 Unit 在 scala 中键入。在spark 用户定义函数中应该返回non-Unit 类型。如果要打印一些数据,或许使用Dataframeshow比较好。 【参考方案1】:

您收到此错误的原因是您的 UDF 没有返回任何内容,就 spark 而言,这称为 Unit。

您应该做什么取决于您实际想要什么,但是,假设您只想跟踪通过 UDF 传递的值,您应该更改 printMe 以使其返回字符串,或者更改 UDF。 像这样:

public String printMe() 
    System.out.println("Value : " + this.ss);
    return this.ss;

或者像这样:

val printme = udf(
  st: String =>
    val x = new JustPrint(st)
    x.printMe();
    x
)

【讨论】:

以上是关于Scala udf UnsupportedOperationException的主要内容,如果未能解决你的问题,请参考以下文章

UDF Scala 火花语法

Scala udf UnsupportedOperationException

Scala:可变参数 UDF

Scala中可以传递给UDF的参数数量

UDF:在 Dataframe scala 上应用函数

使用 Scala 类作为带有 pyspark 的 UDF