首页 > 解决方案 > 如何在两个日期格式列之间按日期过滤 python Spark DataFrame

问题描述

我正在使用 pyspark 2.1,我有一个包含两列日期格式的数据框,如下所示:

Column A ,  START_DT       ,  END_DT
1        ,  2016-01-01     ,  2020-02-04
16       ,  2017-02-23     ,  2017-12-24

我想过滤日期之间的某个日期(例如2018-12-31START_DTEND_DT(在示例中,第二行将被过滤)。

START_DT和列都END_DT已经是日期格式,我正在寻找像 sql 这样的方法:

SELECT *
FROM  MYTABLE  WHERE  '2018-12-31' BETWEEN start_dt AND end_dt

标签: pythonapache-sparkpysparkapache-spark-sqlpyspark-sql

解决方案


如果你有一个有效的 SQL 查询,你总是可以将你的 DataFrame 注册为一个临时表并使用spark.sql()

df.createOrReplaceTempView("MYTABLE")
spark.sql("SELECT * FROM MYTABLE WHERE '2018-12-31' BETWEEN start_dt AND end_dt").show()
#+-------+----------+----------+
#|ColumnA|  START_DT|    END_DT|
#+-------+----------+----------+
#|      1|2016-01-01|2020-02-04|
#+-------+----------+----------+

另一种选择是将表达式传递给where

df.where("'2018-12-31' BETWEEN start_dt AND end_dt").show()
#+-------+----------+----------+
#|ColumnA|  START_DT|    END_DT|
#+-------+----------+----------+
#|      1|2016-01-01|2020-02-04|
#+-------+----------+----------+

另一种方法是使用pyspark.sql.Column.betweenwith pyspark.sql.functions.lit,但您必须使用pyspark.sql.functions.expr才能将列值用作参数

from pyspark.sql.functions import lit, expr

test_date = "2018-12-31"
df.where(lit(test_date).between(expr('start_dt'), expr('end_dt'))).show()
#+-------+----------+----------+
#|ColumnA|  START_DT|    END_DT|
#+-------+----------+----------+
#|      1|2016-01-01|2020-02-04|
#+-------+----------+----------+

最后,您可以实现自己的版本between

from pyspark.sql.functions import col

df.where((col("start_dt") <= lit(test_date)) & (col("end_dt") >= lit(test_date))).show()
#+-------+----------+----------+
#|ColumnA|  START_DT|    END_DT|
#+-------+----------+----------+
#|      1|2016-01-01|2020-02-04|
#+-------+----------+----------+

推荐阅读