过滤pySpark数据框中的日期列记录
Posted
技术标签:
【中文标题】过滤pySpark数据框中的日期列记录【英文标题】:filter date column records in pySpark dataframe 【发布时间】:2020-01-30 19:24:04 【问题描述】:我的输入数据采用以下格式,即 dataframe df_date:
col1, col2, extraction_date, col3
010, DSL, 20191201235900, VDRAC
010, DSL, 20191203235900, VDRAC
010, DSL, 20191205235900, VDRAC
010, DSL, 20200120235900, VDRAC
010, DSL, 20200128235900, VDRAC
010, DSL, 20200129235900, VDRAC
010, DSL, 20200129235900, VDRAC
(string, string, bitint(longtype), string) # I have added the data type of each column for reference)
当我想处理旧日期时,只考虑 29 日之前的记录。我需要过滤它并需要应用业务条件。
import datetime
var = '28-01-2020'
ref_date = datetime.datetime.strptime(var, '%d-%m-%Y').date() #converting input ref date arg to date format
df_fil_date = df_data.filter(df_date.extraction_date.leq(ref_date))
显示错误,因为来自源的提取日期是 long_type (bitint),而 ref_date 变量是日期格式。
能否请您检查并告诉我如何根据传递的日期变量过滤数据?
【问题讨论】:
【参考方案1】:您需要将该列转换为日期类型才能对其他日期列进行任何类型的检查。
clm_name = 'extraction_date'
input_format = 'yyyyMMddHHmmss'
outputformat = 'MM-dd-yyyy HH:mm:ss'
df_data = df_data.withColumn(clm_name, (unix_timestamp( df_data[extraction_date], input_format )))
df_data = df_data.withColumn(clm_name, from_unixtime( df_data[extraction_date], outputformat))
df_data = df_data.withColumn(clm_name, to_timestamp( df_data[clm_name], outputformat).cast('date'))
您可以使用'timestamp'
而不是转换为'date'
,以便在转换期间不会丢失时间信息,但是您将需要另一列的类型为'timestamp'
。
要过滤日期,
var = '2020-01-28'
df_fil_date = df_data.filter(df_date.extraction_date < lit(var).cast('date'))
【讨论】:
以上是关于过滤pySpark数据框中的日期列记录的主要内容,如果未能解决你的问题,请参考以下文章
Pyspark Dataframe - 如何过滤掉另一个数据框中匹配的记录?