【问题标题】:Printing Unique Values in a Column as a Percentage of Total Rows将列中的唯一值打印为总行数的百分比
【发布时间】:2021-12-20 00:34:30
【问题描述】:

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

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 untilate,但大数据工具支持似乎不适用于我的 IDE 版本。很烦人!

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

【问题讨论】:

  • selectExpr 接收代表 sql 表达式 (cast(col_x as string)) 的字符串,但您为其提供了一个可迭代的元组。请参阅下面我建议的解决方案。

标签: scala apache-spark apache-spark-sql distinct


【解决方案1】:

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

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|
+-----+-----+

【讨论】:

  • 显示很好,但是有没有可能从 DataFrame 中取出值?
  • @joesan 当然,使用collect() 而不是show() 并将结果分配给一个变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 2021-10-26
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多