Фильтрация столбца данных фильтра 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
Но в каждой категории есть определенные значения. Что происходит?
Ответы
Ответ 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