2017-02-24 4 views
0

Ich arbeite an PCA-Analyse mit PySpark als Werkzeug, aber ich habe Fehler aufgrund der Kompatibilität der Daten aus der CSV-Datei gelesen. Was soll ich tun? würden Sie mir bitte helfen?Pca-Analyse mit PySpark

from __future__ import print_function 
from pyspark.ml.feature import PCA 
from pyspark.ml.linalg import Vectors, VectorUDT 

from pyspark.sql import SparkSession 
from pyspark import SparkConf, SparkContext 
from pyspark.sql.functions import udf 
import pandas as pd 
import numpy as np 
from numpy import array 


conf = SparkConf().setAppName("building a warehouse") 
sc = SparkContext(conf=conf) 

if __name__ == "__main__": 
    spark = SparkSession\ 
     .builder\ 
     .appName("PCAExample")\ 
     .getOrCreate() 



    data = sc.textFile('dataset.csv') \ 
     .map(lambda line: line.split(','))\ 
     .collect() 
    #create a data frame from data read from csv file 
    df = spark.createDataFrame(data, ["features"]) 
    #convert data to vector udt 

    df.show() 


    pca = PCA(k=3, inputCol="features", outputCol="pcaFeatures") 
    model = pca.fit(df) 

    result = model.transform(df).select("pcaFeatures") 
    result.show(truncate=False) 

    spark.stop() 

hier ist der Fehler Ich erhalte:

File "C:/spark/spark-2.1.0-bin-hadoop2.7/bin/pca_bigdata.py", line 38, in  <module> 
model = pca.fit(df) 
pyspark.sql.utils.IllegalArgumentException: u'requirement failed: Column features must be of type [email protected] but was actually StringType.' 
+0

Können Sie ein Beispiel für die Datei angeben? Vielen Dank. – Keith

+0

Es enthält Daten wie diese: 15,447176933288574,58783,89453125,117,73371124267578,0,0,0,30145,232421875,127,86238861083984,30113,59375,126,52108001708984,512,08636474609375,514,4246826171875,571 , 90142822265625,573,742431640625,586,60888671875,571,6429443359375 ,, –

+0

Sie Zahlen werden immer noch als Strings nicht als Floats gelesen, machen Sie die Map so: 'data = sc.textFile ('dataset.csv'). Map (Lambda-Zeile: [float (k) für k in Zeile.split (',')]) ' –

Antwort

0

Hier Fehlerspalte Notwendigkeit gibt sich selbst VectorUDT statt StringType zu sein. So funktioniert das für Sie: -

from pyspark.mllib.linalg import SparseVector, VectorUDT  
from pyspark.sql.types import StringType, StructField, StructType 
df = spark.createDataFrame(data, StructType([ 
         StructField("features", VectorUDT(), True) 
         ]))