我们有一个特定的需求,其中我将不得不从 dataframe
中drop
列,该列中只有一个唯一值。以下是我们正在做的事情
val rawdata = spark.read.format("csv").option("header","true").option("inferSchema","true").load(filename)
随后,为了在所有列中查找唯一值,我们使用 spark 支持的 HyperLog++
算法
val cd_cols = rawdata.select(rawdata.columns.map(column => approxCountDistinct(col(column)).alias(column)): _*)
输出是
scala> cd_cols.show
+----+----------+---------+---+---------+--------------+---------+----------+----------------+---------+--------------+-------------+
| ID|First Name|Last Name|Age|Attrition|BusinessTravel|DailyRate|Department|DistanceFromHome|Education|EducationField|EmployeeCount|
+----+----------+---------+---+---------+--------------+---------+----------+----------------+---------+--------------+-------------+
|1491| 172| 154| 43| 2| 3| 913| 3| 30| 1| 6| 1|
+----+----------+---------+---+---------+--------------+---------+----------+----------------+---------+--------------+-------------+
请注意,我有两列的唯一值是 1。我想创建另一个 dataframe
,它包含除这两列(Education
和 EmployeeCount
)之外的所有列
我试过使用for循环,但不是很开心,也试过了
cd_cols.columns.filter(colName => cd_cols.filter(colName) <= 1)
那也行不通。
请问有没有更聪明的方法来做到这一点。
谢谢
巴拉
最佳答案
你试试下面的命令:
df.selectExpr(df.first().getValuesMap[Int](df.columns).filter(_._2 != 1).keys.toSeq: _*).show
在这里,我们首先获取 dataframe
的第一行,并使用带有列名的 getValueMap
将其转换为 map ,并仅过滤值不为 1 的列.
关于scala - Spark - Scala - 根据条件从数据框中删除列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44386273/