如何删除pyspark中的常量列,而不是包含null和其他值的列?

cidc1ykv  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(388)

类似的问题被问了好几次,也被回答了好几次。例如:如何在pyspark中自动删除常量列?
但我发现,没有一个答案能解决这个问题 countDistinct() 不将空值视为不同的值。因此,只有两个结果null和一个none null值的列也将被删除。
一个丑陋的解决方案是将sparkDataframe中的所有空值替换为Dataframe中其他地方不存在的值。但就像我说的那样那真的很难看。

o2rvlv0m

o2rvlv0m1#

你可以在 countDistinct ,一个取决于列中是否有空值的整数0或1:


# example dataframe

df.show()
+---+---+----+----+
|  a|  b|   c|   d|
+---+---+----+----+
|  1|  1|   1|null|
|  1|  2|null|null|
+---+---+----+----+

import pyspark.sql.functions as F

cnt = df.agg(*[
    (F.countDistinct(c) + F.max(F.col(c).isNull()).cast('int')).alias(c) 
    for c in df.columns
])

cnt.show()
+---+---+---+---+
|  a|  b|  c|  d|
+---+---+---+---+
|  1|  2|  2|  1|
+---+---+---+---+

df.drop(*[c for c in cnt.first().asDict() if cnt.first()[c] == 1]).show()
+---+----+
|  b|   c|
+---+----+
|  1|   1|
|  2|null|
+---+----+

相关问题