我试图在scala中编写一个处理空值的用户定义函数(udf)。在我的示例中,如果值不为null,我尝试返回列的epoch。我发现选项[]用于从自定义项返回空值。
这是我的自定义项:
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]))
我正在从一个文件创建一个dataframe,该文件如下所示,我想添加“dateepoch”列。我不知道如何让它处理 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")))
1条答案
按热度按时间daupos2t1#
得到的错误意味着您定义的函数需要
Timestamp
(参见repl提供的类型)。但你提供了一个Column
,因此出现错误。这个Column
类型是使用sparksql操作的主要类型。您可以使用预定义的函数和运算符(例如,可以使用+添加列),也可以使用自定义项,但不能使用常规的scala函数。要修复代码,需要使用
udf
功能。你可以这样做:它给出: