2016-05-16 9 views
20

フィルターPysparkのデータフレームの列Iが行値として<code>None</code>を持つ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 
を間違いなく、各カテゴリに値があります。どうしたの?

+0

を有するヌルであるエントリのを持ってヌルでないエントリを得るために://www.python.org/dev/peps/pep-0008/#programming-recommendations)Noneのようなシングルトンとの比較には 'is'と' is not'を使うべきです。 – Natecat

+0

はい、PySparkデータフレームをフィルタリングするのに 'is'も' is not'もありません: 'In [222]:df [df.dt_mvmtはなし] .show() TypeError: '列'オブジェクトは呼び出し可能ではありません。 – Ivan

答えて

38

あなたはColumn.isNull/Column.isNotNullを使用することができます。

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

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

あなたは単にあなたがsubset引数でna.dropを使用することができますNULL値をドロップする場合:NULL

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

平等に基づく比較は動作しません。 SQL NULLは未定義であるため、別の値と比較しようとすると、NULL

が返されます
sqlContext.sql("SELECT NULL = NULL").show() 
## +-------------+ 
## |(NULL = NULL)| 
## +-------------+ 
## |   null| 
## +-------------+ 


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

NULLと値を比較するための唯一の有効な方法は、isNull/isNotNullメソッド呼び出しに相当するIS/IS NOTあります。

+2

素晴らしいです、ありがとうございます。私は、PySparkのデータフレーム上のこれらのフィルタはもっと「ピジョンソニック」だと思っていましたが、悲しいかな、そうではありません。私はこれについてdevsに尋ねることを考えています。 – Ivan

+1

実際それはかなりPythonicです。 Noneを指定して '__eq__'を決してチェックしてはいけません)' is'は同じように動作しないので動作しません。 – zero323

+0

これは、不思議なことに、これは文字列に対してのみ機能します... 'df.filter(" dt_mvmtはNULLでない ")'のように見えます。 –

9

isNotNull機能を使用してみてください。

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

あなたはロック!!!!!!! – logan

5

dt_mvmt列の我々は

df.filter("dt_mvmt is not NULL") 

、我々は[PEP 8](HTTPSによる

df.filter("dt_mvmt is NULL") 
関連する問題