【发布时间】:2020-09-07 13:59:13
【问题描述】:
我正在尝试在 Scala 中编写一个处理空值的用户定义函数 (UDF)。对于我的示例,如果值不为空,我将尝试返回列的纪元。我发现 Option[] 用于从 udf 返回空值。
这是我的 UDF:
def to_epoch(date: Timestamp) : Option[Long] = {
if(date != null) {
Option.apply(date.getTime)
} else {
Option.empty
}
}
val toEpoch: (Timestamp => Option[Long]) => UserDefinedFunction = udf((_: Timestamp => Option[Long]))
我正在从如下读取的文件中创建一个数据框,并且我想添加“dateEpoch”列。我不知道如何让它处理我的udf返回的Option[Long]:
spark.read
.schema(ListeningStatsSchema.schema)
.json(location)
.withColumn("dateEpoch", toEpoch(col("EventTS"))
我得到的错误是:
type mismatch;
found : org.apache.spark.sql.Column
required: java.sql.Timestamp => Option[Long]
.withColumn("opd", toEpoch(col("event_TS")))
【问题讨论】:
-
你需要使用 Some(date.getTime) 和 None 代替 Option.apply 选项和 None 代替 Option.empty 或 Option.empty[Long],你得到的错误是因为在 with 列中,您没有提供正确的功能。
-
函数 toEpoch 采用函数 Timestamp => Option[Long] 并且您正在提供列,您应该在那里传递一个采用 Timestamp 并返回 Option[Long] 的函数
-
问题的标题很可能需要修改@Oli
标签: scala apache-spark user-defined-functions option