SPARK SQL 中的 DATEDIFF

Posted

技术标签:

【中文标题】SPARK SQL 中的 DATEDIFF【英文标题】:DATEDIFF in SPARK SQl 【发布时间】:2018-09-27 00:01:24 【问题描述】:

我是 Spark SQL 的新手。我们正在将数据从 SQL 服务器迁移到 Databricks。 我正在使用火花 SQL 。您能否建议如何在 SPARK sql 中为以下日期函数实现以下功能。我可以看到 datediff 在 spark sql 中只给出了几天。

DATEDIFF(YEAR,StartDate,EndDate)
DATEDIFF(Month,StartDate,EndDate) 
DATEDIFF(Quarter,StartDate,EndDate)

【问题讨论】:

【参考方案1】:

正如您所提到的,SparkSQL 确实支持DATEDIFF,但仅支持几天。我也会小心,因为似乎参数与 Spark 的参数相反,即

--SQL Server
DATEDIFF ( datepart , startdate , enddate )

--Spark
DATEDIFF ( enddate , startdate )

但是,Spark 确实支持称为months_between 的类似函数,您可以使用它来代替DATEDIFF( month ...。此函数还返回一个小数,因此可以选择将其转换为 INT 以获得与

类似的功能
SELECT startDate, endDate, 
  DATEDIFF( endDate, startDate ) AS diff_days,
  CAST( months_between( endDate, startDate ) AS INT ) AS diff_months      
FROM yourTable
ORDER BY 1;

还有yearquarter 函数分别用于确定日期的年份和季度。你可以简单地减去年份,但季度会更棘手。可能是您必须“做数学”或最终使用日历表。

【讨论】:

非常感谢。这真的很有帮助。是的,季度差异看起来很棘手。 只是为了澄清 SQL 服务器似乎需要 DATEDIFF (datepart, recentDate, oldDate) 因为 startdate 和 enddate 有点模糊。【参考方案2】:

由于Spark不提供其他单元,我使用下面的方法,

select 
    (bigint(to_timestamp(endDate))) - (bigint(to_timestamp(startDate))) as time_diff

这会产生第二个单位,因此除以 60 或 3600 可以转换单位。

【讨论】:

以上是关于SPARK SQL 中的 DATEDIFF的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark SQL 中找不到 Hive 表 - Cloudera VM 中的 spark.sql.AnalysisException

Spark改进|Apache Spark 3.0中的SQL性能改进概览

Spark-sql 中的 NullPointerException

如何解决 Spark 中的“aggregateByKey 不是 org.apache.spark.sql.Dataset 的成员”?

spark sql 中的结构化数据

Spark SQL 中的更新查询