【发布时间】:2016-11-08 21:44:38
【问题描述】:
我正在尝试编写可以在 Spark SQL 中的 Dataframes 中工作的 UDF。
这里是代码
def Timeformat (timecol1: Int) = {
if (timecol1 >= 1440)
("%02d:%02d".format((timecol1-1440)/60, (timecol1-1440)%60))
else
("%02d:%02d".format((timecol1)/60, (timecol1)%60))
}
sqlContext.udf.register("Timeformat", Timeformat _)
此方法非常适用于 sqlcontext
val dataa = sqlContext.sql("""select Timeformat(abc.time_band) from abc""")
使用 DF - 获取错误
val fcstdataa = abc.select(Timeformat(abc("time_band_start")))
此方法会引发类型不匹配错误。
<console>:41: error: type mismatch;
found : org.apache.spark.sql.Column
required: Int
当我如下重写 UDF 时,它非常适合 DF,但在 Sqlcontext 中不起作用。有没有办法解决这个问题而不创建多个 UDF 来做同样的事情
val Timeformat = udf((timecol1: Int) =>
if (timecol1 >= 1440)
("%02d:%02d".format((timecol1-1440)/60, (timecol1-1440)%60))
else
("%02d:%02d".format((timecol1)/60, (timecol1)%60))
)
我对 scala 和 spark 很陌生,两个声明之间有什么区别。一种方法比另一种更好吗?
【问题讨论】:
标签: scala apache-spark dataframe apache-spark-sql user-defined-functions