Scala Spark自定义项比较日期
如何使用Scala Spark自定义项比较日期,scala,apache-spark,Scala,Apache Spark,如何使用java.sql.date在spark UDF中进行日期比较 下面是一个例子 def optimisedTDate = udf( (bdate: Date, tdate: Date, pdate: Date, fcdate: Date) => if (tdate == null && pdate == null) fcdate else if (tdate > bdate) tdate els
java.sql.date
在spark UDF中进行日期比较
下面是一个例子
def optimisedTDate =
udf(
(bdate: Date, tdate: Date, pdate: Date, fcdate: Date) =>
if (tdate == null && pdate == null) fcdate
else if (tdate > bdate) tdate
else bdate
)
val processed_df = base_df.withColumn(
"final_date",
optimisedTDate(lit {
Date.valueOf("2010-01-01")
},
col("tdate"),
col("pdate"),
col("fcdate")))
正如其他人所建议的,尽可能使用Spark的内置功能以获得更好的性能。如果必须使用
udf
,可以使用隐式转换来启用日期/时间比较:
import scala.language.implicitConversions
import org.joda.time.DateTime
import java.sql.Date
val d1 = Date.valueOf("2018-06-11")
val d2 = Date.valueOf("2018-06-12")
implicit def dateToDT(d: Date) = new DateTime(d)
d1.isAfter(d2)
// res1: Boolean = false
d1.isBefore(d2)
// res2: Boolean = true
如果您更喜欢使用不等式运算符,请使用以下运算符:
implicit def dateToDT(d: Date) = (new DateTime(d)).getMillis
d1 > d2
// res3: Boolean = false
d1 < d2
// res4: Boolean = true
implicit def dateToDT(d:Date)=(new DateTime(d)).getMillis
d1>d2
//res3:Boolean=false
d1
你不能用内置函数来代替自定义项吗?实际上有很多比较要做,因此我想创建一个自定义项。所讨论的是一个非常基本的比较逻辑,而不是您希望使用when/other的完整比较逻辑。请尽可能使用UDF上的内置函数,它们充分利用了数据布局的知识,并为您节省了大量UDF所需的序列化/反序列化时间<代码>$“date1”。介于($“date2”和$“date3”)之间的($“date2”)和($“date3”)
在IMHO中也更具可读性。感谢大家的帮助,我使用内置函数实现了这一功能。:)