使用 None 值过滤 Pyspark 数据框列

新手上路,请多包涵

我正在尝试过滤具有 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

但是每个类别肯定都有价值。这是怎么回事?

原文由 Ivan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 982
2 个回答

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

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

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

如果您想简单地删除 NULL 值,您可以使用 na.dropsubset 参数:

 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|
## +-------------------+

The only valid method to compare value with NULL is IS / IS NOT which are equivalent to the isNull / isNotNull 方法调用。

原文由 zero323 发布,翻译遵循 CC BY-SA 3.0 许可协议

尝试只使用 isNotNull 函数。

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

原文由 Anthony 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题