如何用Spark的filter/where替代SQL的date(field_date)处理日期数据?
解决Spark中实现SQL
date(field_date) 效果的问题 嘿,我来帮你搞定这个Spark日期过滤的问题!你想要用Spark的filter或where算子实现和SQL里date(field_date)一样的效果——也就是提取字段的日期部分,忽略时间和微秒对吧?下面分几种情况给你具体的实现方案:
情况1:field_date已经是Timestamp类型
如果你的field_date字段已经是Spark的Timestamp类型,直接用to_date函数就能提取日期部分,和SQL的date()函数完全等价。to_date会自动截断时间(包括微秒),只保留年月日部分。
Python 实现
from pyspark.sql.functions import to_date # 使用where算子 filtered_df = df.where(to_date(df.field_date) == '2018-02-13') # 或者用filter算子,两者效果完全相同 filtered_df = df.filter(to_date(df.field_date) == '2018-02-13')
Scala 实现
import org.apache.spark.sql.functions.to_date // 使用where算子 val filteredDF = df.where(to_date($"field_date") === "2018-02-13") // 或者filter算子 val filteredDF = df.filter(to_date($"field_date") === "2018-02-13")
情况2:field_date是String类型
如果field_date是字符串格式(比如你给出的2018-02-13 23:55:11.382928),需要先把它转换成Timestamp类型,再用to_date提取日期:
Python 实现
from pyspark.sql.functions import to_timestamp, to_date # 先转成Timestamp,再提取日期(格式匹配带微秒的字符串) filtered_df = df.where( to_date(to_timestamp(df.field_date, "yyyy-MM-dd HH:mm:ss.SSSSSS")) == '2018-02-13' )
Scala 实现
import org.apache.spark.sql.functions.{to_timestamp, to_date} val filteredDF = df.where( to_date(to_timestamp($"field_date", "yyyy-MM-dd HH:mm:ss.SSSSSS")) === "2018-02-13" )
补充说明
- Spark里的
filter和where算子是完全等价的,只是命名不同,你可以根据自己的习惯选择使用。 - 如果需要批量过滤多个日期,也可以把日期放到一个列表里,用
isin方法,比如:target_dates = ['2018-02-13', '2018-02-14'] filtered_df = df.filter(to_date(df.field_date).isin(target_dates))
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

