2017-06-12 20 views
1

Ich möchte fehlende Werte zu reinigen, indem Sie sie durch den Mittelwert ersetzen.Dieser Quellcode verwendet, um zu arbeiten, ich nicht warum, es funktioniert jetzt nicht.Eine Hilfe wird geschätzt. Hier ist der Datensatz isaubere fehlende Werte Funke mit Aggregation Funktion

RowNumber,Poids,Age,Taille,0MI,Hmean,CoocParam,LdpParam,Test2,Classe 
0,,72,160,5,,2.9421,,3,4 
1,54,70,,5,0.6301,2.7273,,3, 
2,,51,164,5,,2.9834,,3,4 
3,,74,170,5,0.6966,2.9654,2.3699,3,4 
4,108,62,,5,0.6087,2.7093,2.1619,3,4 

Hier verwenden, was ich

tat
val spark = SparkSession.builder.master("local").appName("my-spark-app").getOrCreate() 

    val df = spark.read.option("header", true).option("inferSchema", true).format("com.databricks.spark.csv").load("C:/Users/mhattabi/Desktop/data_with_missing_values3.csv") 
    df.show(false) 
    var newDF = df 
    df.dtypes.foreach { x => 
     val colName = x._1 
     newDF = newDF.na.fill(df.agg(max(colName)).first()(0).toString, Seq(colName)) 
    } 
    newDF.show(false) 

Hier das Ergebnis ist nichts passiert

initial_data 

    +---------+-----+---+------+---+------+---------+--------+-----+------+ 
    |RowNumber|Poids|Age|Taille|0MI|Hmean |CoocParam|LdpParam|Test2|Classe| 
    +---------+-----+---+------+---+------+---------+--------+-----+------+ 
    |0  |null |72 |160 |5 |null |2.9421 |null |3 |4  | 
    |1  |54 |70 |null |5 |0.6301|2.7273 |null |3 |null | 
    |2  |null |51 |164 |5 |null |2.9834 |null |3 |4  | 
    |3  |null |74 |170 |5 |0.6966|2.9654 |2.3699 |3 |4  | 
    |4  |108 |62 |null |5 |0.6087|2.7093 |2.1619 |3 |4  | 
    +---------+-----+---+------+---+------+---------+--------+-----+------+ 

    new_data 
    +---------+-----+---+------+---+------+---------+--------+-----+------+ 
    |RowNumber|Poids|Age|Taille|0MI|Hmean |CoocParam|LdpParam|Test2|Classe| 
    +---------+-----+---+------+---+------+---------+--------+-----+------+ 
    |0  |null |72 |160 |5 |null |2.9421 |null |3 |4  | 
    |1  |54 |70 |null |5 |0.6301|2.7273 |null |3 |null | 
    |2  |null |51 |164 |5 |null |2.9834 |null |3 |4  | 
    |3  |null |74 |170 |5 |0.6966|2.9654 |2.3699 |3 |4  | 
    |4  |108 |62 |null |5 |0.6087|2.7093 |2.1619 |3 |4  | 
    +---------+-----+---+------+---+------+---------+--------+-----+------+ 

Was soll ich

+0

Möchten Sie den Nullwert durch den Maximalwert oder den Mittelwert ersetzen? Sie haben nach dem Mittelwert gefragt und Ihr Codebeispiel wurde maximal verwendet? –

Antwort

1

können Sie withColumn api verwenden und when Funktion für Nullwerte in der columns zu überprüfen, wie

df.dtypes.foreach { x => 
     val colName = x._1 
     val fill = df.agg(max(col(s"`$colName`"))).first()(0).toString 
     newDF = newDF.withColumn(colName, when(col(s"`$colName`").isNull , fill).otherwise(col(s"`$colName`"))) 
    } 
    newDF.show(false) 

Ich hoffe, das Ihr Problem löst

+0

ich habe Problem, wenn der Name der Spalten enthält "." Also muss ich s "' $ {colName} '") verwenden, wie kann ich es auf Ihre Lösung tun, bin nur neu Danke –

+0

meine Antwort aktualisiert, bitte versuchen Sie es jetzt –

+0

aktualisiert wieder als vorherige Aktualisierung funktionierte nicht :) –

0

tun dies sollte :

var imputeDF = df 
df.dtypes.foreach { x => 
     val colName = x._1 
     newDF = newDF.na.fill(df.agg(max(colName)).first()(0).toString , Seq(colName)) } 

Beachten Sie, dass die Verwendung von Änderbaren Datentypen mit scala nicht empfohlen wird.

Abhängig von Ihren Daten können Sie einen SQL-Join oder etwas anderes verwenden, um die Nullen durch einen geeigneteren Wert zu ersetzen.

+0

Bitte überprüfen Sie das Update, nichts ist passiert Vielen Dank im Voraus –

+0

@MaherHTB Die Spalten enthalten Nullen, sind sie "Int" oder "Double"? – philantrovert

+0

überprüfen Sie bitte das Update –

0

Wenn Sie versuchen, die null Werte mit dem Mittelwert zu ersetzen Wert dann berechnen Sie mean und fill als

import org.apache.spark.sql.functions.mean 


    val data = spark.read.option("header", true) 
      .option("inferSchema", true).format("com.databricks.spark.csv") 
      .load("data.csv") 

    //Calculate the mean for each column and create a map with its column name 
    //and use na.fill() method to replace null with that mean 

    data.na.fill(data.columns.zip(
      data.select(data.columns.map(mean(_)): _*).first.toSeq 
     ).toMap) 

Ich habe den Code lokal getestet und funktioniert gut.

Ausgang:

+---------+-----+---+------+---+------------------+---------+------------------+-----+------+ 
|RowNumber|Poids|Age|Taille|0MI|    Hmean|CoocParam|   LdpParam|Test2|Classe| 
+---------+-----+---+------+---+------------------+---------+------------------+-----+------+ 
|  0| 81| 72| 160| 5|0.6451333333333333| 2.9421|2.2659000000000002| 3|  4| 
|  1| 54| 70| 164| 5|   0.6301| 2.7273|2.2659000000000002| 3|  4| 
|  2| 81| 51| 164| 5|0.6451333333333333| 2.9834|2.2659000000000002| 3|  4| 
|  3| 81| 74| 170| 5|   0.6966| 2.9654|   2.3699| 3|  4| 
|  4| 108| 62| 164| 5|   0.6087| 2.7093|   2.1619| 3|  4| 
+---------+-----+---+------+---+------------------+---------+------------------+-----+------+ 

hoffe, das hilft!

+0

Danke, es hat funktioniert, aber als ich "." In Spalten Name Ich werde.Es gibt eine Ausnahme gefangen Ich muss mit Backslash arbeiten, bitte jede Hilfe –

+0

Großartig zu hören, dass es funktioniert hat, dachte ich, es war die effiziente Lösung. –

Verwandte Themen