首页 文章

使用无值过滤Pyspark数据框列

提问于
浏览
41

我正在尝试过滤具有 None 作为行值的PySpark数据帧:

df.select('dt_mvmt').distinct().collect()

[Row(dt_mvmt=u'2016-03-27'),
 Row(dt_mvmt=u'2016-03-28'),
 Row(dt_mvmt=u'2016-03-29'),
 Row(dt_mvmt=None),
 Row(dt_mvmt=u'2016-03-30'),
 Row(dt_mvmt=u'2016-03-31')]

我可以使用字符串值正确过滤:

df[df.dt_mvmt == '2016-03-31']
# some results here

但这失败了:

df[df.dt_mvmt == None].count()
0
df[df.dt_mvmt != None].count()
0

但每个类别肯定都有 Value 观 . 这是怎么回事?

3 回答

  • 92

    你可以使用 Column.isNull / Column.isNotNull

    df.where(col("dt_mvmt").isNull())
    
    df.where(col("dt_mvmt").isNotNull())
    

    如果您只想删除 NULL 值,可以使用带有 subset 参数的 na.drop

    df.na.drop(subset=["dt_mvmt"])
    

    NULL 进行基于平等的比较将不起作用,因为在SQL中, NULL 未定义,因此任何将其与另一个值进行比较的尝试都会返回 NULL

    sqlContext.sql("SELECT NULL = NULL").show()
    ## +-------------+
    ## |(NULL = NULL)|
    ## +-------------+
    ## |         null|
    ## +-------------+
    
    
    sqlContext.sql("SELECT NULL != NULL").show()
    ## +-------------------+
    ## |(NOT (NULL = NULL))|
    ## +-------------------+
    ## |               null|
    ## +-------------------+
    

    将值与 NULL 进行比较的唯一有效方法是 IS / IS NOT ,它等同于 isNull / isNotNull 方法调用 .

  • 15

    尝试使用isNotNull函数 .

    df.filter(df.dt_mvmt.isNotNull()).count()
    
  • 8

    要获取 dt_mvmt 列中的值不为null的条目,我们有

    df.filter("dt_mvmt is not NULL")
    

    对于我们有空的条目

    df.filter("dt_mvmt is NULL")
    

相关问题