scala - Spark - Scala - 根据条件从数据框中删除列

标签 scala apache-spark

我们有一个特定的需求,其中我将不得不从 dataframedrop 列,该列中只有一个唯一值。以下是我们正在做的事情

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,它包含除这两列(EducationEmployeeCount)之外的所有列

我试过使用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/

相关文章:

scala - addSbtPlugin(...) 导致驱逐警告,但 'evicted' 命令什么也没显示

java - 在scala中从json中提取数据

apache-spark - 无法将作业提交到 Spark 集群(集群模式)

apache-spark - Spark 连接执行器失败

scala - 在 Scala 中,如何在对该变量的列表进行排序之前将方法应用于变量?

scala - self => 是用来做什么的?

scala - Slick:Codegen 外键引用

amazon-ec2 - EC2上的Spark无法利用所有可用内核

apache-spark - Spark Multiple Join 内存不足错误

python - 在 pyspark 中处理大数字的数据类型