NameError:Spark中未定义全局名称“NoneType”

时间:2016-08-19 14:17:54

标签: python apache-spark pyspark user-defined-functions bigdata

我编写了一个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”

有谁可以帮我解决这个问题?

3 个答案:

答案 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_colNone时将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;清洁"你的数据框。