Pyspark DataFrame如何实现Snowflake SQL的日期间隔及BETWEEN逻辑?
PySpark 对应实现代码
首先导入PySpark SQL需要用到的函数:
from pyspark.sql.functions import col, to_timestamp, from_utc_timestamp, date_sub
和你给出的Snowflake SQL完全等价的PySpark过滤逻辑如下:
# 先实现时区转换并转为日期类型,对应SQL的CONVERT_TIMEZONE逻辑 la_date = from_utc_timestamp(to_timestamp(col("some_date_string_col")), "America/Los_Angeles").cast("date") # 调用内置between方法实现区间筛选 result_df = myDf.filter( col("date_col").between( date_sub(la_date, 7), date_sub(la_date, 1) ) )
对应逻辑说明
- 时区转换:原SQL中
CONVERT_TIMEZONE('UTC','America/Los_Angeles', some_date_string_col)::DATE的逻辑,在PySpark中先通过to_timestamp把字符串格式的UTC时间转为时间戳,再用from_utc_timestamp转换为洛杉矶时区的时间戳,最后通过cast("date")转为日期类型,和SQL效果完全一致。 - 日期间隔:SQL的
INTERVAL 'n DAY'做日期减法,对应PySpark的date_sub(日期列, 间隔天数)函数,加天数则用date_add,你也可以用表达式写法实现同样效果,比如expr("la_date - INTERVAL 7 DAY")也是合法写法。 - BETWEEN语法:PySpark的列对象自带
between(下界, 上界)方法,和SQL的BETWEEN ... AND ...逻辑完全一致,包含上下界取值,不需要单独拆分写大于等于、小于等于两个条件。
如果你偏好更贴近SQL的写法,也可以直接传SQL表达式实现:
result_df = myDf.filter(""" date_col BETWEEN date_sub(from_utc_timestamp(to_timestamp(some_date_string_col), 'America/Los_Angeles'), 7) AND date_sub(from_utc_timestamp(to_timestamp(some_date_string_col), 'America/Los_Angeles'), 1) """)
内容的提问来源于stack exchange,提问作者amggg013
相关产品推荐
相关产品推荐

