Ich habe einen Datensatz mit 10 Feld und 5000 Zeilen. Ich möchte diesen Datensatz mit einigen statistischen Methoden in Spark with Scala vervollständigen. Ich habe die leeren Zellen in einem Feld mit dem Mittelwert dieses Feldes gefüllt, wenn es aus kontinuierlichen Werten besteht, und ich gebe den häufigsten Wert in das Feld ein, wenn es aus diskreten Werten besteht. Hier ist mein Code:Wie kann ich die Leistung verbessern, wenn ich eine Tabelle mit statistischen Methoden in Apache-Spark ausfülle?
for(col <- cols){
val datacount = table.select(col).rdd.map(r => r(0)).filter(_ == null).count()
if(datacount > 0)
{
if (continuous_lst contains col) // put mean of data to null values
{
var avg = table.select(mean(col)).first()(0).asInstanceOf[Double]
df = df.na.fill(avg, Seq(col))
}
else if(discrete_lst contains col) // put most frequent categorical value to null values
{
val group_df = df.groupBy(col).count()
val sorted = group_df.orderBy(desc("count")).take(1)
val most_frequent = sorted.map(t => t(0))
val most_frequent_ = most_frequent(0).toString.toDouble.toInt
val type__ = ctype.filter(t => t._1 == col)
val type_ = type__.map(t => t._2)
df = df.na.fill(most_frequent_, Seq(col))
}
}
}
Das Problem ist, dass dieser Code sehr langsam mit diesen Daten arbeitet. Ich verwende spark-submit
mit executor memory 8G
Parameter. Und ich benutze parpartition (4) Parameter vor dem Senden der Daten an diese Funktion.
Ich sollte größere Datenmengen arbeiten. Wie kann ich diesen Code beschleunigen?
Danke für Ihre Hilfe. Hier