火花时差

Geo*_*ler 1 scala apache-spark apache-spark-sql apache-spark-dataset

从 spark 1.5.x 开始,添加了一些方便的方法来处理时间。

df.select(datediff($"A", $"B")).show
Run Code Online (Sandbox Code Playgroud)

但这会返回天数差异。是否有任何选项可以将其转换为不同的时间间隔,例如年?

我手动使用

df.select(year($"A")- year($"B")).show
Run Code Online (Sandbox Code Playgroud)

这已经足够了。但是,如果日期差异计算得更准确,例如包括显示的月/日,那就更好了http://howtodoinjava.com/for-fun-only/java-code-to-calculate-age-from-date-of-出生/

UDF 是当前 spark 2.0.2 的首选解决方案吗?或者我是否缺少将差异转换为天数到例如年数的选项?

zer*_*323 5

Timestamp类型可以以秒为单位转换为其 Unix 时间戳。如果这个分辨率对你来说足够好,剩下的就是一堆算术运算。您可以按秒计算差异:

import org.apache.spark.sql.Column

def secondsBetween(col1: Column, col2: Column) =
  col2.cast("timestamp").cast("bigint") - col1.cast("timestamp").cast("bigint")
Run Code Online (Sandbox Code Playgroud)

并根据您的需要重新取样,例如:

def minutesBetween(col1: Column, col2: Column) =
  (secondsBetween(col1, col2) / 60).cast("bigint")
Run Code Online (Sandbox Code Playgroud)

显然,这并不能处理日期和时间处理的所有微妙之处,例如夏令时或闰秒,因此如果这些在您的领域中很重要,那么建议使用带有适当时间处理库的 UDF。