从spark 1.5.x开始,我们添加了一些方便的方法来处理时间。
df.select(datediff($"A", $"B")).show
但这会以天为单位返回差异。有没有选择将其转换为不同的间隔,例如年?
手动我用过
df.select(year($"A")- year($"B")).show
这是足够好的。但如果更准确地计算日期差异会更好,例如包括显示http://howtodoinjava.com/for-fun-only/java-code-to-calculate-age-from-date-of-birth/
之类的月/日UDF是当前spark 2.0.2的首选解决方案吗?或者我错过了将差异转换为天数的选项,例如年?
答案 0 :(得分:4)
Timestamp
类型可以在几秒钟内转换为Unix时间戳。如果这个分辨率对你来说足够好,剩下的只是一堆算术运算。您可以在几秒钟内计算差异:
import org.apache.spark.sql.Column
def secondsBetween(col1: Column, col2: Column) =
col2.cast("timestamp").cast("bigint") - col1.cast("timestamp").cast("bigint")
并根据您的需要重新抽样,例如:
def minutesBetween(col1: Column, col2: Column) =
(secondsBetween(col1, col2) / 60).cast("bigint")
显然,这并不能处理日期和时间处理的所有微妙之处,如夏令时或闰秒,所以如果这些在您的域中很重要,那么建议使用带有适当时间处理库的UDF。