2017-06-16 7 views
0

Also bin ich zu Apache Funken neu und ich habe eine Datei, die wie folgt aussieht:Wie mit Java Apache Spark MLlib arbeiten, wenn DataFrame Spalten hat?

Name  Size Records 
File1 1,000 104,370 
File2 950  91,780 
File3 1,500 109,123 
File4 2,170 113,888 
File5 2,000 111,974 
File6 1,820 110,666 
File7 1,200 106,771 
File8 1,500 108,991 
File9 1,000 104,007 
File10 1,300 107,037 
File11 1,900 111,109 
File12 1,430 108,051 
File13 1,780 110,006 
File14 2,010 114,449 
File15 2,017 114,889 

Das ist meine Probe/Testdaten. Ich arbeite an einem Anomalie-Erkennungsprogramm und ich muss andere Dateien mit dem gleichen Format, aber unterschiedlichen Werten testen und feststellen, welche Anomalien in der Größe und den Aufzeichnungswerten bestehen (wenn sich Größe/Datensätze in einer anderen Datei stark von der Standarddatei unterscheiden) oder wenn Größe und Datensätze nicht proportional zueinander sind). Ich beschloss, verschiedene ML-Algorithmen auszuprobieren, und ich wollte mit dem k-Means-Ansatz beginnen. Ich habe versucht, diese Datei in die folgende Zeile zu setzen:

Datei ist bereits zu einer Datensatzvariable geparst. Allerdings bekomme ich einen Fehler und ich bin ziemlich sicher, dass es mit der Struktur/dem Schema der Datei zu tun hat. Gibt es eine Möglichkeit, mit strukturierten/etikettierten/organisierten Daten zu arbeiten, wenn man versucht, sich in ein Modell einzufügen?

Ich bekomme den folgenden Fehler: Ausnahme im Thread "Haupt" java.lang.IllegalArgumentException: Feld "Features" ist nicht vorhanden.

Und das ist der Code:

public class practice { 

public static void main(String[] args) { 
    SparkConf conf = new SparkConf().setAppName("Anomaly Detection").setMaster("local"); 
    JavaSparkContext sc = new JavaSparkContext(conf); 

    SparkSession spark = SparkSession 
       .builder() 
       .appName("Anomaly Detection") 
       .getOrCreate(); 

String day1 = "C:\\Users\\ZK0GJXO\\Documents\\day1.txt"; 

    Dataset<Row> df = spark.read(). 
      option("header", "true"). 
      option("delimiter", "\t"). 
      csv(day1); 
    df.show(); 
    KMeans kmeans = new KMeans().setK(2).setSeed(1L); 
    KMeansModel model = kmeans.fit(df); 
} 

}

Dank

Antwort

2

Standardmäßig werden alle Spark-ML-Modelle auf einer Säule trainieren "Features" genannt. Man kann eine andere Eingabespaltennamen über die setFeaturesCol Methode angeben http://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/clustering/KMeans.html#setFeaturesCol(java.lang.String)

Update:

Man kann mehrere Spalten in einem einzigen Merkmalsvektor mit VectorAssembler kombinieren:

VectorAssembler assembler = new VectorAssembler() 
.setInputCols(new String[]{"size", "records"}) 
.setOutputCol("features"); 

Dataset<Row> vectorized_df = assembler.transform(df) 

KMeans kmeans = new KMeans().setK(2).setSeed(1L); 
KMeansModel model = kmeans.fit(vectorized_df); 

Man kann weiter rationalisieren und die Kette diese Feature-Transformationen mit der Pipeline-API https://spark.apache.org/docs/latest/ml-pipeline.html#example-pipeline

+0

Warte so, dass sie nur auf einer Spalte trainieren und den Rest ignorieren? –

+0

Um in mehreren Spalten zu trainieren, können Sie einen Feature-Vektor mit VectorAssembler erstellen, wie in https://spark.apache.org/docs/latest/ml-features.html#vectorasembler beschrieben –

Verwandte Themen