如何在PySpark中将字典字符串日期转换为timestamp用于DataFrame过滤
问题原因
cast() 是PySpark Column 类型的专属方法,无法直接作用于Python原生字符串变量,你之前的写法是把Python字符串当做Spark列调用方法,自然无法生效。
解决方法
有两种可行的实现方案,都可以满足类型匹配要求:
方案1:用Spark内置函数转换
通过 lit() 把Python字符串转为Spark字面量,再做类型转换:
from pyspark.sql import functions as F from pyspark.sql.types import TimestampType dateFilter = {"date1": "2021-05-14", "date2": "2021-05-10"} # 遍历转换字典内所有日期为Spark Timestamp类型 for col_name in dateFilter: dateFilter[col_name] = F.to_timestamp(F.lit(dateFilter[col_name])).cast(TimestampType()) # 过滤逻辑示例:同时匹配两列条件 df = df.filter( (F.col("date1") <= dateFilter["date1"]) & (F.col("date2") <= dateFilter["date2"]) )
方案2:用Python datetime模块转换
Spark支持直接和Python datetime类型对象做Timestamp类比较,无需调用Spark API:
from datetime import datetime dateFilter = {"date1": "2021-05-14", "date2": "2021-05-10"} # 遍历转成Python datetime对象 for col_name in dateFilter: dateFilter[col_name] = datetime.strptime(dateFilter[col_name], "%Y-%m-%d") # 后续过滤逻辑和方案1完全一致 df = df.filter( (F.col("date1") <= dateFilter["date1"]) & (F.col("date2") <= dateFilter["date2"]) )
两种方案处理后DataFrame的timestamp列类型都不会发生变化,可直接正常使用。
内容的提问来源于stack exchange,提问作者Leilei
相关产品推荐
相关产品推荐

