對于資料清理步驟之一,我想深入了解唯一值如何作為總行數的百分比存在,以便我可以應用閾值并決定是否應該完全洗掉此列/功能。為此,我想出了這個函式,如下所示:
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 notebook 中,我也缺少 IDE 的功能。我有 IntelliJ untilate,但大資料工具支持似乎不適用于我的 IDE 版本。很煩人!
關于問題出在哪里的任何想法?我想我弄亂了 selectExpr(....) 中的 DataFrame。可以看出,我正在回傳一個包含我計算資訊的元組。
uj5u.com熱心網友回復:
您可以用更簡單的方式計算它:
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|
----- -----
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/350176.html
上一篇:Haskell中的廣度優先遍歷
