如何计算日期列和当前日期之间的差异?

时间:2017-04-18 12:45:57

标签: scala apache-spark apache-spark-sql

我正在尝试计算列字段与系统当前日期之间的日期差异。

这是我的示例代码,其中我用20170126硬编码了我的列字段。

val currentDate = java.time.LocalDate.now
var datediff = spark.sqlContext.sql("""Select  datediff(to_date('$currentDate'),to_date(DATE_FORMAT(CAST(unix_timestamp( cast('20170126' as String), 'yyyyMMdd') AS TIMESTAMP), 'yyyy-MM-dd'))) AS  GAP
        """)
datediff.show()

Output is like:
+----+
| GAP|
+----+
|null|
+----+ 

我需要计算两个日期之间的实际差距,但需要NULL

1 个答案:

答案 0 :(得分:2)

您尚未定义“列字段”的类型和格式,因此我假设它是(非常非常愉快)格式YYYYMMdd中的字符串。

val records = Seq((0, "20170126")).toDF("id", "date")

scala> records.show
+---+--------+
| id|    date|
+---+--------+
|  0|20170126|
+---+--------+

scala> records
  .withColumn("year", substring($"date", 0, 4))
  .withColumn("month", substring($"date", 5, 2))
  .withColumn("day", substring($"date", 7, 2))
  .withColumn("d", concat_ws("-", $"year", $"month", $"day"))
  .select($"id", $"d" cast "date")
  .withColumn("datediff", datediff(current_date(), $"d"))
  .show
+---+----------+--------+
| id|         d|datediff|
+---+----------+--------+
|  0|2017-01-26|      83|
+---+----------+--------+

PROTIP :阅读functions对象。

注意事项

铸造

请注意,根据DateTimeUtils.stringToDate中的规则,我无法说服Spark SQL cast列“日期”为DateType

  
      
  • yyyy
  •   
  • yyyy-[m]m
  •   
  • yyyy-[m]m-[d]d
  •   
  • yyyy-[m]m-[d]d
  •   
  • yyyy-[m]m-[d]d *
  •   
  • yyyy-[m]m-[d]dT*
  •   

DATE_FORMAT

我无法说服date_format工作,因此我使用substringconcat_ws函数自行解析了“日期”列。