行の値として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
しかし、各カテゴリには必ず値があります。どうしたの?
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"])
SQLではNULL
と同等性に基づく比較は機能しません。なぜならSQLではNULL
は未定義なので、それを別の値と比較しようとするとNULL
が返されるからです。
sqlContext.sql("SELECT NULL = NULL").show()
## +-------------+
## |(NULL = NULL)|
## +-------------+
## | null|
## +-------------+
sqlContext.sql("SELECT NULL != NULL").show()
## +-------------------+
## |(NOT (NULL = NULL))|
## +-------------------+
## | null|
## +-------------------+
ValueをNULL
と比較する唯一の有効な方法はIS
/IS NOT
で、これはisNull
/isNotNull
メソッド呼び出しと同等です。
単に isNotNull 関数を使ってみてください。
df.filter(df.dt_mvmt.isNotNull()).count()
dt_mvmt
列の値がnullではないエントリを取得するには、
df.filter("dt_mvmt is not NULL")
nullのエントリについては
df.filter("dt_mvmt is NULL")
PySparkは算術的、論理的およびその他の条件に基づいてさまざまなフィルタリングオプションを提供します。 NULL値が存在すると、それ以降のプロセスが妨げられる可能性があります。それらを削除するか、統計的にそれらを代入することが選択になる可能性があります。
以下のコードセットが考えられます。
# Dataset is df
# Column name is dt_mvmt
# Before filtering make sure you have the right count of the dataset
df.count() # Some number
# Filter here
df = df.filter(df.dt_mvmt.isNotNull())
# Check the count to ensure there are NULL values present (This is important when dealing with large dataset)
df.count() # Count should be reduced if NULL values are present