在sparksql中按天和月比较日期

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

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

  1. date1 | date2 | flag
  2. 2017-05-05 | 2016-10-15 | N
  3. 2019-06-22 | 2020-02-06 | Y
  4. 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

  1. sparksql2.4中使用查询
  2. 谢谢
ne5o7dgx

ne5o7dgx1#

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

  1. import pyspark.sql.functions as F
  2. input_row=[["2017-05-05","2016-10-15"],["2019-06-22","2020-02-06"],["2020-10-09","2020-10-09"]]
  3. df = spark.createDataFrame(input_row,["date1","date2"])
  4. df.show()
  5. '''
  6. +----------+----------+
  7. | date1| date2|
  8. +----------+----------+
  9. |2017-05-05|2016-10-15|
  10. |2019-06-22|2020-02-06|
  11. |2020-10-09|2020-10-09|
  12. +----------+----------+
  13. '''

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

  1. df.createOrReplaceTempView("test_table")
  2. 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()
  3. '''
  4. +----------+----------+----+
  5. | date1| date2|FLAG|
  6. +----------+----------+----+
  7. |2017-05-05|2016-10-15| N|
  8. |2019-06-22|2020-02-06| Y|
  9. |2020-10-09|2020-10-09| E|
  10. +----------+----------+----+
  11. '''

方法2。使用spark sql datediff 功能

  1. df.createOrReplaceTempView("test_table")
  2. 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()
  3. '''
  4. +----------+----------+----+
  5. | date1| date2|FLAG|
  6. +----------+----------+----+
  7. |2017-05-05|2016-10-15| Y|
  8. |2019-06-22|2020-02-06| N|
  9. |2020-10-09|2020-10-09| E|
  10. +----------+----------+----+
  11. '''

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

  1. 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()
  2. '''
  3. +----------+----------+----+
  4. | date1| date2|FLAG|
  5. +----------+----------+----+
  6. |2017-05-05|2016-10-15| Y|
  7. |2019-06-22|2020-02-06| N|
  8. |2020-10-09|2020-10-09| E|
  9. +----------+----------+----+
  10. '''
展开查看全部

相关问题