如果其他,Spark scala udf 错误

Posted

技术标签:

【中文标题】如果其他,Spark scala udf 错误【英文标题】:Spark scala udf error for if else 【发布时间】:2017-01-24 03:53:04 【问题描述】:

我正在尝试使用函数 getTIme 为 spark scala udf 定义 udf,但我收到的错误为 error: illegal start of declaration。语法中可能有什么错误并返回日期,如果存在解析异常而不是返回 null,请将某些字符串作为 error

发送
def getTime=udf((x:String) : java.sql.Timestamp => 
 if (x.toString() == "")  return null  
else  val format = new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss"); 
val d = format.parse(x.toString());
val t = new Timestamp(d.getTime()); return t  
)

谢谢!

【问题讨论】:

在 if 条件下尝试 null.asInstanceOf[Timestamp] 我认为 null.asInstanceOf[Timestamp] 是因为解析日期期间的错误消息为空,但错误是什么“错误:声明的非法开始” 【参考方案1】:

udf 的返回类型是派生的,不应指定。将第一行代码改为:

def getTime=udf((x:String) => 
// your code

这应该可以消除错误。

以下是以函数式风格编写并使用 Scala 结构的完整工作代码:

val data: Seq[String] = Seq("", null, "2017-01-15 10:18:30")
val ds = spark.createDataset(data).as[String]

import java.text.SimpleDateFormat
import java.sql.Timestamp

val fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
// ********HERE  is the udf completely re-written: **********
val f = udf((input: String) => 
  Option(input).filter(_.nonEmpty).map(str => new Timestamp(fmt.parse(str).getTime)).orNull
)

val ds2 = ds.withColumn("parsedTimestamp", f($"value"))

以下是输出:

+-------------------+--------------------+
|              value|     parsedTimestamp|
+-------------------+--------------------+
|                   |                null|
|               null|                null|
|2017-01-15 10:18:30|2017-01-15 10:18:...|
+-------------------+--------------------+

【讨论】:

【参考方案2】:

您应该使用 Scala 数据类型,而不是 Java 数据类型。它会是这样的:

def getTime(x: String): Timestamp = 
//your code here


【讨论】:

【参考方案3】:

你可以通过这种方式轻松做到:

  def getTimeFunction(timeAsString: String): java.sql.Timestamp = 
  if (timeAsString.isEmpty)
    null
  else 
    val format = new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss")
    val date = format.parse(timeAsString.toString())
    val time = new Timestamp(date.getTime())
    time
  

val getTimeUdf = udf(getTimeFunction _)

然后相应地使用这个 getTimeUdf。 !

【讨论】:

String 输入在哪里给 udf(getTimeFunction _) 这里。

以上是关于如果其他,Spark scala udf 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 scala 在 spark sql 中编写 UDF

Scala Spark 中的 udf 运行时错误

使用 Scala 从 Spark 的 withColumn 中调用 udf 时出错

SPARK 数据框错误:在使用 UDF 拆分列中的字符串时无法转换为 scala.Function2

模式匹配范围在Scala与Spark udf

spark自定义UDF为啥参数最多21个