spark-sql内置的dayofmonth函数返回奇怪的结果

时间:2019-03-05 06:23:39

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

由于某些奇怪的原因,spark中的dayofmonth函数似乎在1500 or less年内返回了奇怪的值。

以下是获得的结果->

scala> spark.sql("SELECT dayofmonth('1501-02-14') ").show()
+------------------------------------+
|dayofmonth(CAST(1501-02-14 AS DATE))|
+------------------------------------+
|                                  14|
+------------------------------------+


scala> spark.sql("SELECT dayofmonth('1500-02-14') ").show()
+------------------------------------+
|dayofmonth(CAST(1500-02-14 AS DATE))|
+------------------------------------+
|                                  13|
+------------------------------------+


scala> spark.sql("SELECT dayofmonth('1400-02-14') ").show()
+------------------------------------+
|dayofmonth(CAST(1400-02-14 AS DATE))|
+------------------------------------+
|                                  12|
+------------------------------------+

谁能解释一下,为什么星火会这样表现?

1 个答案:

答案 0 :(得分:6)

这是因为日期在外部以deployment.yml的形式显示,并在内部以自 Unix时代(1970-01-01)以来的日期数表示。

参考文献source 1source 23

这主要是在处理1970年之前的日期时产生很多问题,但是您可以尝试使用可能能够解决此问题的外部库来创建java.sql.Date(我无法相信我正在写这篇文章)按照here的建议。

提醒:当然,您需要考虑使用udf的性能瓶颈。 here的更多内容。

有关Unix时间的更多信息,您可以阅读以下内容:

https://en.wikipedia.org/wiki/Unix_time