python - 如何在两个日期格式列之间按日期过滤 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-31
)START_DT
和END_DT
(在示例中,第二行将被过滤)。
START_DT
和列都END_DT
已经是日期格式,我正在寻找像 sql 这样的方法:
SELECT *
FROM MYTABLE WHERE '2018-12-31' BETWEEN start_dt AND end_dt
解决方案
如果你有一个有效的 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
with 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|
#+-------+----------+----------+
推荐阅读
- php - form action 和 post 方法如何一起工作?
- ms-access - 如何对sql查询引用组中的多列求和
- mongodb - Mongo 查询将值推送到数组,该数组本身是另一个数组的元素
- stm32 - STM32F1x 异常、优先级和 NVIC
- algorithm - WPL树算法实现
- ruby - 为什么 state_machine 的事件没有在模型回调时触发?
- coldfusion - cfprocparam 抛出错误执行数据库查询
- r - 基于项目的协同过滤在推荐实验室 r 中不断运行
- java - androidx.cardview.widget.CardView 无法转换为 androidx.recyclerview.widget.RecyclerView
- r - 闪亮的过滤日期导致错误,但不确定它到底是什么