我们如何在Pyspark
中使用日期类型列的isNull()
条件。我需要更新列名REGISTER_DATE,当它为空并且还满足其他条件时?
data = [{"REGISTER_DATE": '', "FORM_DATE": '16-12-2022', "GENDER": Female, "Truth": True},
{"REGISTER_DATE": '13-09-2022', "FORM_DATE": '06-12-2022',"GENDER": Female"Truth":True},
{"REGISTER_DATE": '', "FORM_DATE": '20-12-2022', "GENDER": Female, "Truth": True},
{"REGISTER_DATE": '', "FORM_DATE": '18-12-2022', "GENDER": Female, "Truth": True}]
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
create_df = spark.createDataFrame(data)
FORM_DATE
和REGISTER_DATE
列为日期数据类型,性别为字符串
我正在尝试的查询是:
create_df=create_df.withColumn('REGISTER_DATE',F.when((col('REGISTER_DATE').isNull()) &
(col('FORM_DATE') !='') & (col('GENDER')== 'FEMALE'), create_df.FORM_DATE)
.otherwise(create_df['REGISTER_DATE']))
查询运行正常,但不更新列REGISTER_DATE,即使源文件中存在条件。
据我所知,isNull
与 date 类型列一起使用可能无效。如果条件匹配,我希望使用FORM_DATE
列值更新REGISTER_DATE
列空值。
3条答案
按热度按时间xfyts7mz1#
假设你有一个
data
:使用此架构:
如果你的类型是
date
(在REGISTER_DATE
和FORM_DATE
列上),它们将永远不会有空字符串;date
类型是有效日期或null
。如果我们这样做:
然后,我们将得到以下输出:
在您的示例中,您用空字符串填充数据,并声称它们属于
date
类型,但实际情况并非如此,您的&
条件使整个语句变为false,这可能是因为您试图将date
类型与空字符串进行比较,但实际情况并非如此。您只需要确保
REGISTER_DATE
和FORM_DATE
是date
而不是string
,并且铸造(如果您将来这样做的话)是正确的。祝你好运!
wvyml7n52#
使用你提供的数据,它正在创建字符串数据类型的列。2如果是这种情况,那么对于空字符串,你必须使用==''条件。3记住,空字符串不等于null。4然而,如果你的意思是说你的实际数据具有日期数据类型的列,并且这个示例代码/数据具有字符串是不正确的,那么我们不能在spark中的日期数据类型的列中插入空字符串。
您的代码是正确的,并且在以下情况下无需任何修改即可正常工作
1.你的数据是正确的日期数据类型,而不是以字符串数据类型存储的日期。
1.值是正确的null而不是空字符串。
screenshot showing datatype of the dataframe created from data provided in question
screenshot showing it works with stringDatatType=='' & DateType can not accept object '' in type
g2ieeal73#
我希望它适用于您的解决方案,将REGISTER_DATE和FORM_DATE转换为datetype,然后实现您的逻辑或转换为日期,然后使用合并函数,就像在SQL中一样。我将REGISTER_DATE和FORM_DATE转换回字符串,因为如果它包含任何依赖项。