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
しかし、各カテゴリには確かに値があります。何が起こっているのでしょうか?
ベストアンサー1
Column.isNull
/ を使用できますColumn.isNotNull
:
df.where(col("dt_mvmt").isNull())
df.where(col("dt_mvmt").isNotNull())
単に値を削除したい場合は、引数とともにNULL
使用できます。na.drop
subset
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