Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 筛选不带值的Pyspark数据帧列_Python_Apache Spark_Dataframe_Pyspark_Apache Spark Sql - Fatal编程技术网

Python 筛选不带值的Pyspark数据帧列

Python 筛选不带值的Pyspark数据帧列,python,apache-spark,dataframe,pyspark,apache-spark-sql,Python,Apache Spark,Dataframe,Pyspark,Apache Spark Sql,我正在尝试筛选一个行值为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')] 我可以使用字符串值进行正

我正在尝试筛选一个行值为
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')]
我可以使用字符串值进行正确筛选:

df[df.dt_mvmt == '2016-03-31']
# some results here
但这失败了:

df[df.dt_mvmt == None].count()
0
df[df.dt_mvmt != None].count()
0

但每个类别都有明确的价值。发生了什么事?

您可以使用
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
是未定义的,因此任何将其与另一个值进行比较的尝试都会返回
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
方法调用

尽量只使用函数

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

要获取
dt_mvmt
列中的值不为空的条目,我们需要

df.filter("dt_mvmt is not NULL")
df.filter("dt_mvmt is NULL")
对于空的条目,我们有

df.filter("dt_mvmt is not NULL")
df.filter("dt_mvmt is NULL")

PySpark根据算术、逻辑和其他条件提供各种过滤选项。空值的存在可能会妨碍进一步的处理。删除它们或从统计上归罪它们可能是一种选择

可以考虑以下代码集:

# 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

若要筛选出列中无值的记录,请参见以下示例:

df=spark.createDataFrame([[123,"abc"],[234,"fre"],[345,None]],["a","b"])
现在过滤掉空值记录:

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

df.show()
如果要从DF中删除这些记录,请参见以下内容:

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

df1.show()
如果列=无

COLUMN_OLD_VALUE
----------------
None
1
None
100
20
------------------
使用 在数据框上创建一个诱人的:

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

因此,如果您想继续使用Pandas syntex,请使用:
column\u old\u value='None'

,这对我很有用

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

有多种方法可以从DataFrame中的列中删除/筛选空值

让我们使用以下代码创建一个简单的数据帧:

date = ['2016-03-27','2016-03-28','2016-03-29', None, '2016-03-30','2016-03-31']
df = spark.createDataFrame(date, StringType())
现在,您可以尝试以下方法之一过滤掉空值

# 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.
您还可以查看my上的“使用空值”部分以了解更多信息


我希望它能有所帮助。

None/Null是pyspark/python中NoneType类的数据类型 所以,当您试图将非类型对象与字符串对象进行比较时,下面的操作将不起作用

错误的过滤方式 df[df.dt_mvmt==None].count() 0 df[df.dt_mvmt!=None].count() 0

对的 df=df.where(col(“dt_mvmt”).isNotNull()) 返回dt_mvmt为None/Null的所有记录

isNull()/isNotNull()将返回dt_mvmt为Null或!空

method_1 = df.filter(df['dt_mvmt'].isNotNull()).count()
method_2 = df.filter(df.dt_mvmt.isNotNull()).count()

两者都将返回相同的结果

太棒了,谢谢。我原以为PySpark数据帧上的这些过滤器会更“pythonic”,但遗憾的是,它们不是。我正在考虑向开发人员询问这件事。事实上,这很像蟒蛇。您不应在无的情况下选中
\uuuuuueq\uuuuu
)而
is
将不起作用,因为它的行为方式不同。奇怪的是,这只适用于字符串列。。。这看起来像是
df.filter(“dt_mvmt不是NULL”)
处理这两个问题。实际上,您希望筛选具有NULL值的行,而不是没有值的列。标题可能有误导性。简而言之,包含null(在本例中为None)的比较总是返回false。特别是,比较(null==null)返回false。此外,比较(None==None)返回false。