打印列中的唯一值作为总行的百分比

Printing Unique Values in a Column as a Percentage of Total Rows

对于其中一个数据清理步骤,我想深入了解唯一值占总行数的百分比,以便我可以应用阈值并决定是否应该完全删除此列/ 特征。为此,我想出了如下这个功能:

def uniqueValuesAsPercentage(data: DataFrame) = {
  val (rowCount, columnCount) = shape(data)
  data.selectExpr(data.head().getValuesMap[Long](data.columns).map(elem => {
      val (columnName, uniqueCount) = elem
      val percentage = uniqueCount / rowCount * 100
      (columnName, uniqueCount, percentage) 
  }))
}

但失败并出现以下错误:

<console>:90: error: type mismatch;
 found   : scala.collection.immutable.Iterable[(String, Long, Long)]
 required: String
         data.selectExpr(data.head().getValuesMap[Long](data.columns).map(elem => {

不幸的是,由于这是在 Apache Zeppelin 笔记本中,我还缺少 IDE 的功能。我有 IntelliJ 直到最近,但大数据工具支持似乎不适用于我的 IDE 版本。很烦人!

关于这里的问题有什么想法吗?我想我弄乱了 selectExpr(....) 中的 DataFrame。可以看出,我正在返回一个包含我计算的信息的元组。

你可以用更简单的方法计算它:

import org.apache.spark.sql.functions.{col, countDistinct, count}

import spark.implicits._

// define a dataframe for example
val data = Seq(("1", "1"), ("1", "2"), ("1", "3"), ("1", "4")).toDF("col_a", "col_b")

data.select(data.columns.map(c => (lit(100) * countDistinct(col(c)) / count(col(c))).alias(c)): _*).show()

// output:
+-----+-----+
|col_a|col_b|
+-----+-----+
| 25.0|100.0|
+-----+-----+