我编写了一个UDF,用“NA”替换名为“latest_travel_date”的列中的一些特定日期值。但是,此列还包含许多空值,因此我也在UDF中处理了这个值。 (请参阅下文)
Query:
def date_cleaner(date_col):
if type(date_col) == NoneType:
pass
else:
if year(date_col) in ('1899','1900'):
date_col= 'NA'
else:
pass
return date_col
date_cleaner_udf = udf(date_cleaner, DateType())
Df3= Df2.withColumn("latest_cleaned", date_cleaner_udf("latest_travel_date"))
然而,我不断收到错误: NameError:未定义全局名称“NoneType”
有谁可以帮我解决这个问题?
答案 0 :(得分:4)
这个问题可以通过两种方式解决。
如果您尝试从dataFrame中找到Null值,则应使用NullType。
像这样:
if type(date_col) == NullType
或者您可以找到date_col是否为None:
if date_col is None
我希望这有帮助。
答案 1 :(得分:1)
问题在于这一行:
if type(date_col) == NoneType:
看起来你真的想要:
if date_col is None:
答案 2 :(得分:0)
正如迈克尔指出的那样,你无法做到
if type(date_col) == NoneType:
但是,将其更改为None
将无法完成任务。
date_col= 'NA'
它是StringType
,但您将返回类型声明为DateType
。评论中的_jvm
错误是抱怨数据类型不匹配。
您似乎只想在date_col
或None
时将1899
标记为1900
,并删除所有Null。如果是这样,你可以这样做:
def date_cleaner(date_col):
if date_col:
if year(date_col) in ('1899','1900'):
return None
return date_col
date_cleaner_udf = udf(date_cleaner, DateType())
Df3= Df2.withColumn("latest_cleaned", date_cleaner_udf("latest_travel_date")).dropna(subset=["latest_travel_date"])
这是因为DateType
可以采用有效的日期时间或Null(默认情况下)。你可以做dropna
到#34;清洁"你的数据框。