7
import numpy as np 

df = spark.createDataFrame(
    [(1, 1, None), (1, 2, float(5)), (1, 3, np.nan), (1, 4, None), (1, 5, float(10)), (1, 6, float('nan')), (1, 6, float('nan'))], 
    ('session', "timestamp1", "id2")) 

sản lượng dự kiến ​​Làm thế nào để tìm số lượng giá trị Null và Nan cho mỗi cột trong một khung dữ liệu Pyspark hiệu quả?

dataframe với tội danh nan/null cho mỗi cột

Lưu ý: Những câu hỏi trước đó tôi tìm thấy trong stack overflow chỉ kiểm tra cho null & không nan. Đó là lý do tại sao tôi đã tạo một câu hỏi mới.

Tôi biết tôi có thể sử dụng hàm isnull() trong tia lửa để tìm số giá trị Null trong cột Spark nhưng cách tìm giá trị Nan trong khung dữ liệu Spark?

+0

Bạn có muốn tính riêng giá trị nan/Null cho mỗi cột (do đó, hai cột cho mỗi cột) hoặc bạn có muốn biết chỉ có bao nhiêu phần tử của các cột không thể được coi là một số? – titiro89

+0

số lượng riêng biệt của giá trị nan/Null sẽ hoạt động –

Trả lời

13

Bạn có thể sử dụng phương pháp thể hiện here và thay thế isNull với isnan:

from pyspark.sql.functions import isnan, when, count, col 

df.select([count(when(isnan(c), c)).alias(c) for c in df.columns]).show() 
+-------+----------+---+ 
|session|timestamp1|id2| 
+-------+----------+---+ 
|  0|   0| 3| 
+-------+----------+---+ 

hoặc

df.select([count(when(isnan(c) | col(c).isNull(), c)).alias(c) for c in df.columns]).show() 
+-------+----------+---+ 
|session|timestamp1|id2| 
+-------+----------+---+ 
|  0|   0| 5| 
+-------+----------+---+ 
+0

Điều này đã hiệu quả! Tại sao col (c) .isnan() đưa ra lỗi trong khi col (c) .isNull() hoạt động tốt? Vui lòng giải thích. –

+1

[isNull] (http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html?highlight=isnull#pyspark.sql.Column.isNull) vs [isnan] (http: //spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html?highlight=isnan#pyspark.sql.functions.isnan). Hai liên kết này sẽ giúp bạn. "isnan()" là một hàm của gói pysparq.sql.function, vì vậy bạn phải đặt cột nào bạn muốn sử dụng làm đối số của hàm. "isNull()" thuộc về gói pyspark.sql.Column, vì vậy những gì bạn phải làm là "yourColumn.isNull()" – titiro89

2

Bạn có thể tạo một UDF để ckeck cả nullNaN và trả về giá trị boolean để lọc

val isNaN = udf((value : Float) => { 
    if (value.equals(Float.NaN) || value == null) true else false }) 

val result = data.filter(isNaN(data("column2"))).count() 

Hy vọng điều này sẽ hữu ích!

Các vấn đề liên quan