我有一个名为的pyspark数据框df
。我想知道他的列是否包含NA,我不在乎它只是一行还是全部。问题是,我目前知道是否有NA的方式是这样的:
from pyspark.sql import functions as F
if (df.where(F.isnull('column_name')).count() >= 1):
print("There are nulls")
else:
print("Yey! No nulls")
我在这里看到的问题是,我需要计算整列中的空值数量,这浪费了大量时间,因为我希望该过程在找到第一个空值时停止。
我曾考虑过这种解决方案,但不确定是否可以工作(因为我与很多其他人一起在集群中工作,因此执行时间取决于集群中其他人运行的多项工作,因此我无法比较这两种方法在均匀条件下):
(df.where(F.isnull('column_name')).limit(1).count() == 1)
增加限制有帮助吗?是否有更有效的方法来实现这一目标?
如果null
存在具有值的记录(请参见下文),我们可能会从查询中挤出更多性能,但是什么时候不存在呢?如果您打算多次运行此查询,并且每次都更改答案,那么您应该知道(我并不是说您不是),如果答案是“null
整个过程中没有任何值数据框”,那么您将不得不扫描整个数据框以了解这一点,并且没有一种快速的方法来做到这一点。如果您经常需要此类信息,而答案经常是“否”,则几乎可以肯定地希望将此类信息保留在某个地方,并在每次插入可能具有null
值的记录时通过仅检查该记录来对其进行更新。
count()
可能会使情况变得更糟。
- 在计数情况下,Spark使用了广泛的转换,并实际上在每个分区上应用了LocalLimit并混洗部分结果以执行GlobalLimit。
- 以Spark为例,Spark使用了窄变换并仅在第一个分区上评估了LocalLimit。
换句话说,.limit(1).count()
很可能从数据集的每个分区中选择一个示例,然后再从该示例列表中选择一个示例。您的意图是在找到一个示例后立即中止操作,但是不幸的是,count()
它似乎还不够聪明,无法自行实现。
作为由同一个例子提到了,不过,你可以使用take()
,first()
或head()
达到你想要的使用情况。这将更有效地限制要检查的分区数:
如果不需要重新排序(无需聚合,联接或排序),则将优化这些操作以检查足以满足该操作的分区-可能是数据集整体分区的较小子集。
请注意,在其他情况下count()
可以提高性能。正如另一个SO问题正确指出的那样,
两者都不能保证总体上更好的性能。
根据您的存储方法和架构,您也许可以从查询中获取更多性能。
select(F.lit(True))
在isnull
和之间插入一个take
。从理论上讲,这应该减少集群中的工人需要传输的信息量。如果只有几个简单类型的列,这不太重要,但是如果您具有复杂的数据结构,这可能会有所帮助,而且不太可能受到损害。null
值有很好的猜测,则绝对应该通过以下方式过滤数据框:该分区以加快查询速度。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句