在sparksql中按天和月比较日期

7nbnzgx9  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(415)

如何比较两个日期 Month 以及 Day 仅在spark sql查询中?我的表有两列, date1 以及 date2 . 我需要比较一下,看看 dd & MM 部分 date1 (组合)大于或等于 date2 并相应地设置一个标志。
例如:

date1      |    date2   | flag
2017-05-05 | 2016-10-15 |  N
2019-06-22 | 2020-02-06 |  Y
2020-10-09 | 2020-10-09 |  E

我尝试了类似这样的方法来提取所需的部分(就像在其他rdbms中一样),但无法让它工作。我期望函数返回 MM 以及 dd 作为 int 我可以比较一下,但这又是另一个 date ```
select
date1,
date2,
case when (date_trunc('MM', date1) > date_trunc('MM', date2) ) AND (date_trunc('dd', date1) > date_trunc('dd', date2) )
then 'Y'
when (date_trunc('MM', date1) = date_trunc('MM', date2) ) AND (date_trunc('dd', date1) = date_trunc('dd', date2) )
then 'E'
else 'N'
end as flag

在sparksql2.4中使用查询
谢谢
ne5o7dgx

ne5o7dgx1#

下面的代码可能有助于解决您的问题,

import pyspark.sql.functions as F

input_row=[["2017-05-05","2016-10-15"],["2019-06-22","2020-02-06"],["2020-10-09","2020-10-09"]]

df = spark.createDataFrame(input_row,["date1","date2"])
df.show()

'''
+----------+----------+
|     date1|     date2|
+----------+----------+
|2017-05-05|2016-10-15|
|2019-06-22|2020-02-06|
|2020-10-09|2020-10-09|
+----------+----------+
'''

方法1:使用spark sql和 month 以及 dayofmonth 内置方法

df.createOrReplaceTempView("test_table")

spark.sql("select *,case when ((month(CAST(`date1` AS DATE)) > month(CAST(`date2` AS DATE))) and (dayofmonth(CAST(`date1` AS DATE))> dayofmonth(CAST (`date2` AS DATE)))) then 'Y' when ((month(CAST(`date1` AS DATE)) < month(CAST(`date2` AS DATE))) and (dayofmonth(CAST(`date1` AS DATE))< dayofmonth(CAST (`date2` AS DATE)))) then 'N'  else 'E' end as FLAG from test_table").show()

'''
+----------+----------+----+
|     date1|     date2|FLAG|
+----------+----------+----+
|2017-05-05|2016-10-15|   N|
|2019-06-22|2020-02-06|   Y|
|2020-10-09|2020-10-09|   E|
+----------+----------+----+
'''

方法2。使用spark sql datediff 功能

df.createOrReplaceTempView("test_table")

spark.sql("select *, case when datediff(date1, date2)>0 then 'Y' when datediff( date1, date2 )<0 then 'N' else 'E' end as FLAG from test_table").show()

'''
+----------+----------+----+
|     date1|     date2|FLAG|
+----------+----------+----+
|2017-05-05|2016-10-15|   Y|
|2019-06-22|2020-02-06|   N|
|2020-10-09|2020-10-09|   E|
+----------+----------+----+
'''

三。另一种方法是使用df表达式而不是sparksql,

df.select(df["*"], F.expr("CASE WHEN datediff( date1, date2 )>0 THEN 'Y' " + "WHEN datediff( date1, date2 )<0 then 'N' " + "else 'E' end").alias("FLAG")).show()

'''
+----------+----------+----+
|     date1|     date2|FLAG|
+----------+----------+----+
|2017-05-05|2016-10-15|   Y|
|2019-06-22|2020-02-06|   N|
|2020-10-09|2020-10-09|   E|
+----------+----------+----+
'''

相关问题