Lọc cột khung dữ liệu Pyspark không có giá trị nào


100

Tôi đang cố gắng lọc khung dữ liệu PySpark có Nonegiá trị hàng:

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 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 chắc chắn có các giá trị trên mỗi danh mục. Chuyện gì vậy?


Bạn thực sự muốn lọc các hàng có giá trị rỗng, không phải một cột có giá trị Không. Tiêu đề có thể gây hiểu lầm.
Atorpat

Tóm lại, phép so sánh liên quan đến null (hoặc Không, trong trường hợp này) luôn trả về false. Đặc biệt, phép so sánh (null == null) trả về false. Ngoài ra, phép so sánh (None == None) trả về false.
Richard Gomes

Câu trả lời:


204

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 chỉ muốn giảm NULLcác giá trị, bạn có thể sử dụng na.dropvới subsetđối số:

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

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

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


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

Phương pháp hợp lệ duy nhất để so sánh giá trị với NULLIS/ IS NOTtương đương vớiisNullisNotNull lệnh gọi / method.


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

1
Trên thực tế nó là khá Pythonic. Bạn không bao giờ nên kiểm tra __eq__với Không;) Và issẽ không hoạt động vì nó không hoạt động theo cùng một cách.
0323

2
Kỳ lạ là điều này chỉ hoạt động cho các cột chuỗi ... Có vẻ như df.filter("dt_mvmt is not NULL")xử lý cả hai.
David Arenburg


14

Để có được các mục nhập có giá trị trong dt_mvmtcột không rỗng, chúng ta có

df.filter("dt_mvmt is not NULL")

và đối với các mục nhập rỗng, chúng tôi có

df.filter("dt_mvmt is NULL")

2

Nếu bạn muốn giữ lại tổng hợp Pandas, điều này đã làm việc cho tôi.

df = df[df.dt_mvmt.isNotNull()]

1

nếu cột = Không có

COLUMN_OLD_VALUE
----------------
None
1
None
100
20
------------------

Sử dụng tạo bảng tạm trên khung dữ liệu:

sqlContext.sql("select * from tempTable where column_old_value='None' ").show()

Vì vậy, hãy sử dụng: column_old_value='None'


1

Có nhiều cách để bạn có thể loại bỏ / lọc các giá trị rỗng khỏi một cột trong DataFrame.

Hãy tạo một DataFrame đơn giản với mã dưới đây:

date = ['2016-03-27','2016-03-28','2016-03-29', None, '2016-03-30','2016-03-31']
df = spark.createDataFrame(date, StringType())

Bây giờ bạn có thể thử một trong các cách tiếp cận dưới đây để lọc ra các giá trị null.

# Approach - 1
df.filter("value is not null").show()

# Approach - 2
df.filter(col("value").isNotNull()).show()

# Approach - 3
df.filter(df["value"].isNotNull()).show()

# Approach - 4
df.filter(df.value.isNotNull()).show()

# Approach - 5
df.na.drop(subset=["value"]).show()

# Approach - 6
df.dropna(subset=["value"]).show()

# Note: You can also use where function instead of a filter.

Bạn cũng có thể kiểm tra phần "Làm việc với Giá trị NULL" trên blog của tôi để biết thêm thông tin.

Tôi hy vọng nó sẽ giúp.


0

PySpark cung cấp các tùy chọn lọc khác nhau dựa trên các điều kiện số học, logic và các điều kiện khác. Sự hiện diện của giá trị NULL có thể cản trở các quá trình tiếp theo. Loại bỏ chúng hoặc áp đặt chúng về mặt thống kê có thể là một lựa chọn.

Bộ mã dưới đây có thể được coi là:

# 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


0

Nếu bạn muốn lọc ra các bản ghi có giá trị Không có trong cột thì hãy xem ví dụ dưới đây:

df=spark.createDataFrame([[123,"abc"],[234,"fre"],[345,None]],["a","b"])

Bây giờ hãy lọc ra các bản ghi giá trị null:

df=df.filter(df.b.isNotNull())

df.show()

Nếu bạn muốn xóa các bản ghi đó khỏi DF thì hãy xem bên dưới:

df1=df.na.drop(subset=['b'])

df1.show()

0

None / Null là một kiểu dữ liệu của lớp NoneType trong pyspark / python, vì vậy, bên dưới sẽ không hoạt động khi bạn đang cố gắng so sánh đối tượng NoneType với đối tượng chuỗi

Cách lọc sai

df [df.dt_mvmt == Không có] .count () 0 df [df.dt_mvmt! = Không có] .count () 0

chính xác

df = df.where (col ("dt_mvmt"). isNotNull ()) trả về tất cả các bản ghi có dt_mvmt là None / Null

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.