Подтвердить что ты не робот

Фильтрация столбца данных фильтра Pyspark без значения None

Я пытаюсь отфильтровать фреймворк PySpark с None как значение строки:

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

Но в каждой категории есть определенные значения. Что происходит?

4b9b3361

Ответ 1

Вы можете использовать Column.isNull/Column.isNotNull:

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

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

Если вы хотите просто сбросить значения NULL, вы можете использовать na.drop с аргументом subset:

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

Сравнение на основе равенства с NULL не будет работать, потому что в SQL NULL есть undefined, поэтому любая попытка сравнить его с другим значением возвращает NULL:

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


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

Единственным допустимым методом сравнения значения с NULL является IS/IS NOT, который эквивалентен вызовам методов isNull/isNotNull.

Ответ 2

Попробуйте использовать isNotNull.

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

Ответ 3

Чтобы получить записи, значения которых в столбце dt_mvmt не равны нулю, мы имеем

df.filter("dt_mvmt is not NULL")

а для нулевых записей имеем

df.filter("dt_mvmt is NULL")

Ответ 4

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