web-dev-qa-db-ja.com

Pysparkデータフレーム列をNone値でフィルタします。

行の値として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

しかし、各カテゴリには必ず値があります。どうしたの?

61
Ivan

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メソッド呼び出しと同等です。

124
zero323

単に isNotNull 関数を使ってみてください。

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

dt_mvmt列の値がnullではないエントリを取得するには、

df.filter("dt_mvmt is not NULL")

nullのエントリについては

df.filter("dt_mvmt is NULL")
9
timctran

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