我有一个用一些空值定义的框架。一些列是完全空值。
>> df.show()
+---+---+---+----+
| A| B| C| D|
+---+---+---+----+
|1.0|4.0|7.0|null|
|2.0|5.0|7.0|null|
|3.0|6.0|5.0|null|
+---+---+---+----+
字符串
在我的例子中,我想返回一个由空值填充的列名列表。我的想法是检测常量列(因为整个列包含相同的空值)。
我是这么做的
nullCoulumns = [c for c, const in df.select([(min(c) == max(c)).alias(c) for c in df.columns]).first().asDict().items() if const]
型
但这并不把空列当作常量,它只对值起作用。那么我应该怎么做呢?
4条答案
按热度按时间li9yvcax1#
将条件扩展到
字符串
或者使用
eqNullSafe
(PySpark 2.3):型
nsc4cvqm2#
一种方法是隐式地执行:选择每一列,计算其NULL值,然后将其与总数或行数进行比较。对于您的数据,这将是:
字符串
但是有一个更简单的方法:事实证明,函数
countDistinct
,当应用于所有NULL值的列时,返回零(0):型
所以
for
循环现在可以是:型
更新(注解后):在第二个解决方案中似乎可以避免
collect
;由于df.agg
返回的是一个只有一行的字符串,因此将collect
替换为take(1)
将安全地完成这项工作:型
bwntbbo33#
为了保证列是 all null,必须满足两个属性:
(1)最小值等于最大值
(2)min * 或 * max为null
或等效地
(1)最小值和最大值都等于
None
注意,如果不满足性质(2),则列值为
[null, 1, null, 1]
的情况将被错误地报告,因为最小值和最大值将为1
。字符串
这里有一个实践中的例子:
型
qlzsbp2j4#
时间有效:Spark> 3.1如果你的Not列数比No列数多
通常,检查整个col是否为非列是一个耗时的操作,但是通常调用
isNotNull()
比调用Notarrow列的isNull()
要快。如果您希望有更多的Notarrow列,那么下面的limit()
技巧可以加快很多。字符串
结果为0意味着它是一个null col,否则为1。现在你可以在spark框架中循环所有列。