我正在尝试计算列字段与系统当前日期之间的日期差异。
这是我的示例代码,其中我用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
。
答案 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
工作,因此我使用substring
和concat_ws
函数自行解析了“日期”列。