udf spark Scala 返回案例类

Posted

技术标签:

【中文标题】udf spark Scala 返回案例类【英文标题】:udf spark Scala return case class 【发布时间】:2019-12-11 19:33:39 【问题描述】:
import org.apache.spark.sql.functions._

case class oneClass(a : Int , b: String , c :string)

val doSomthing = udf ((t1 : Seq[String], str : String , values : t2 Seq[String])
    => 
    val pos = t1.indexOf(str)
    if (pos >= 0) oneClass(pos, str,t2(pos))
    //if no control of pos possible return -1 ===> indexoutofboundsexception
    //if control the udf return Any then when I use it ===> Exception
    
)

只有当 pos >= 0 并且一直返回 case class 时,我如何才能返回 case class ??

【问题讨论】:

【参考方案1】:

如果这不应该发生,要么抛出异常(spark 作业将失败):

val doSomthing = udf ((t1 : Seq[String], str : String , t2 :Seq[String])=> 
  val pos = t1.indexOf(str)
  if (pos >= 0) oneClass(pos, str,t2(pos)) else 
    throw new IllegalArgumentException
  
)

否则使用Option:

val doSomthing = udf ((t1 : Seq[String], str : String , t2 :Seq[String])=> 
  val pos = t1.indexOf(str)
  if (pos >= 0) Some(oneClass(pos, str,t2(pos))) else None
)

在后一种情况下,您的 DataFrame 中的结果将是 nullNone 转换为 null

如果没有抛出异常,也可以用于返回结果的模式:

val doSomthing = udf ((t1 : Seq[String], str : String , t2 :Seq[String])=> 
  scala.util.Try
  val pos = t1.indexOf(str)
  oneClass(pos, str,t2(pos))
  .toOption
)

这对测试很有用,但我不认为这是一种好的做法

【讨论】:

非常感谢,我需要的是当 pos 为 -1 时不返回任何内容,否则返回 oneClass(pos, str,t2(pos) @K.T.A ??这就是我写的,None 什么都不是……

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

带有转义字段名称的 Scala 案例类在 Spark Catalyst 代码生成期间引发错误

如何将火花行(StructType)投射到scala案例类

如何将复杂的 Java 类对象作为参数传递给 Spark 中的 Scala UDF?

如何在 Spark Scala 中的 Schema RDD [从案例类中创建] 中查找重复项以及相应的重复计数?

参数为空时,Spark Scala UDF 不返回预期值

rdd.mapPartitions 从 Spark Scala 中的 udf 返回布尔值