我正在使用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
)(在此示例中,第二行将被过滤)。 / p>
START_DT
和END_DT
列均已采用日期格式,我一直在寻找类似sql的方法:
SELECT *
FROM MYTABLE WHERE '2018-12-31' BETWEEN start_dt AND end_dt
答案 0 :(得分:1)
如果您有有效的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
才能use a column value as a parameter。
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|
#+-------+----------+----------+