Как фильтровать питон Spark DataFrame по дате между двумя столбцами формата даты - PullRequest
0 голосов
/ 26 марта 2019

Я использую 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-31) между датами от START_DT до END_DT (в приведенном здесь примере будет отфильтрована вторая строка).

Оба столбца START_DT и END_DT уже имеют формат даты, я искал метод, подобный sql:

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

1 Ответ

1 голос
/ 26 марта 2019

Если у вас есть рабочий запрос 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.between с 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|
#+-------+----------+----------+
...