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