Iva*_*van 76 python dataframe apache-spark apache-spark-sql pyspark
我正在尝试过滤具有None行值的PySpark数据帧:
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')]
Run Code Online (Sandbox Code Playgroud)
我可以使用字符串值正确过滤:
df[df.dt_mvmt == '2016-03-31']
# some results here
Run Code Online (Sandbox Code Playgroud)
但这失败了:
df[df.dt_mvmt == None].count()
0
df[df.dt_mvmt != None].count()
0
Run Code Online (Sandbox Code Playgroud)
但每个类别肯定都有价值观.这是怎么回事?
zer*_*323 153
你可以使用Column.isNull/ Column.isNotNull:
df.where(col("dt_mvmt").isNull())
df.where(col("dt_mvmt").isNotNull())
Run Code Online (Sandbox Code Playgroud)
如果您想简单地删除NULL可以na.drop与subset参数一起使用的值:
df.na.drop(subset=["dt_mvmt"])
Run Code Online (Sandbox Code Playgroud)
基于等同的比较NULL将不起作用,因为在SQL NULL中未定义,因此任何将其与另一个值进行比较的尝试都会返回NULL:
sqlContext.sql("SELECT NULL = NULL").show()
## +-------------+
## |(NULL = NULL)|
## +-------------+
## | null|
## +-------------+
sqlContext.sql("SELECT NULL != NULL").show()
## +-------------------+
## |(NOT (NULL = NULL))|
## +-------------------+
## | null|
## +-------------------+
Run Code Online (Sandbox Code Playgroud)
唯一有效的比较值的方法NULL是IS//IS NOT等同于isNull/ isNotNull方法调用.
Ant*_*ony 24
尝试使用isNotNull函数.
df.filter(df.dt_mvmt.isNotNull()).count()
Run Code Online (Sandbox Code Playgroud)
小智 10
要获取dt_mvmt列中的值不为null的条目,我们有
df.filter("dt_mvmt is not NULL")
Run Code Online (Sandbox Code Playgroud)
对于我们有空的条目
df.filter("dt_mvmt is NULL")
Run Code Online (Sandbox Code Playgroud)
小智 7
isNull()/isNotNull()将返回具有 Null 或 !Null 的相应行dt_mvmt。
method_1 = df.filter(df['dt_mvmt'].isNotNull()).count()
method_2 = df.filter(df.dt_mvmt.isNotNull()).count()
Run Code Online (Sandbox Code Playgroud)
两者都会返回相同的结果
有多种方法可以从 DataFrame 的列中删除/过滤空值。
让我们使用以下代码创建一个简单的 DataFrame:
date = ['2016-03-27','2016-03-28','2016-03-29', None, '2016-03-30','2016-03-31']
df = spark.createDataFrame(date, StringType())
Run Code Online (Sandbox Code Playgroud)
现在您可以尝试以下方法之一来过滤掉空值。
# 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.
Run Code Online (Sandbox Code Playgroud)
您还可以查看我博客上的“使用 NULL 值”部分以获取更多信息。
我希望它有帮助。