scala—为什么在使用返回option[long]类型的对象的udf时会出现类型不匹配错误?

s2j5cfk0  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(926)

我试图在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")))
daupos2t

daupos2t1#

得到的错误意味着您定义的函数需要 Timestamp (参见repl提供的类型)。但你提供了一个 Column ,因此出现错误。这个 Column 类型是使用sparksql操作的主要类型。您可以使用预定义的函数和运算符(例如,可以使用+添加列),也可以使用自定义项,但不能使用常规的scala函数。
要修复代码,需要使用 udf 功能。你可以这样做:

val to_epoch_udf = udf(to_epoch _)

// And we can try it:
spark.range(1).select(to_epoch_udf(current_timestamp)).show

它给出:

+------------------------+
|UDF(current_timestamp())|
+------------------------+
|1599492185730           |
+------------------------+

相关问题