2016-05-16 53 views
20

Tôi đang cố gắng để lọc một dataframe PySpark có None như một giá trị hàng:Lọc cột Pyspark dataframe với Không giá trị

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')] 

và tôi có thể lọc một cách chính xác với một giá trị chuỗi:

df[df.dt_mvmt == '2016-03-31'] 
# some results here 

nhưng điều này không thành công:

df[df.dt_mvmt == None].count() 
0 
df[df.dt_mvmt != None].count() 
0 

Nhưng có giá trị chắc chắn trên mỗi danh mục. Chuyện gì vậy?

+0

Theo [PEP 8] (https : //www.python.org/dev/peps/pep-0008/#programming-recommendations) bạn nên sử dụng 'is' và' is not' để so sánh với các singletons như None. – Natecat

+0

Có, nhưng không có 'is' hoặc' không phải là 'để lọc các khung dữ liệu PySpark: ' Trong [222]: df [df.dt_mvmt là Không có] .show() LoạiError: đối tượng 'Cột' không thể gọi được – Ivan

Trả lời

38

Bạn có thể sử dụng Column.isNull/Column.isNotNull:

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

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

Nếu bạn muốn chỉ đơn giản là thả NULL giá trị mà bạn có thể sử dụng na.drop với subset luận:

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

so sánh bình đẳng dựa với NULL sẽ không hoạt động bởi vì trong SQL NULL không xác định nên bất kỳ nỗ lực nào so sánh nó với một giá trị khác trả về NULL:

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


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

duy nhất phương pháp hợp lệ để so sánh giá trị với NULLIS/IS NOT đó tương đương với isNull/isNotNull lời gọi phương thức.

+2

Tuyệt vời, cảm ơn. Tôi nghĩ rằng những bộ lọc này trên các khung dữ liệu PySpark sẽ có nhiều "pythonic" hơn, nhưng than ôi, chúng không phải. Tôi đang nghĩ về việc hỏi các nhà phát triển về điều này. – Ivan

+1

Thực ra nó khá là Pythonic. Bạn không bao giờ nên kiểm tra '__eq__' với None;) Và' is' sẽ không hoạt động vì nó không hoạt động theo cùng một cách. – zero323

+0

Điều kỳ lạ này chỉ hoạt động đối với các cột chuỗi ... Có vẻ như 'df.filter (" dt_mvmt không phải là NULL ")' xử lý cả hai. –

9

Cố gắng chỉ sử dụng hàm isNotNull.

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

bạn đá !!!!!!! – logan

5

Để có được các mục có giá trị trong cột dt_mvmt không phải là null chúng tôi có

df.filter("dt_mvmt is not NULL") 

và cho các mục đó là null chúng tôi có

df.filter("dt_mvmt is NULL") 
Các vấn đề liên quan