2016-07-10 24 views
1

Ich mache eine Studie in Apache Spark und ich bin etwas wirklich seltsam. Sehen Sie den Code unten:Fehler beim Konvertieren von RDD in Datenrahmen PySpark

ClimateRdd = ClimateRdd.map(lambda x: tuple(x)) 
print ClimateRdd.first() 

diese Befehle geben mir diese Zeile: ('1743-11-01', '4.3839999999999995', '2.294', '\xc3\x85land')

Dann bewege ich dies zu einem Datenrahmen wie folgt aus:

schemaDf = sqlContext.createDataFrame(ClimateRdd, schema) 
schemaDf.registerTempTable('globalTemp') 
result = sqlContext.sql("SELECT dt FROM globalTemp") 
result.show(5) 

Das funktioniert perfekt und ich habe diese Ergebnis:

+----------+ 
|  dt| 
+----------+ 
|1743-11-01| 
|1743-12-01| 
|1744-01-01| 
|1744-02-01| 
|1744-03-01| 
+----------+ 
only showing top 5 rows 

Nachdem ich die Abfrage nehme Ergebnis und versucht, die Linien zu laufen:

dates = result.map(lambda x: "Datas: " + x.dt) 
print dates.collect() 

Ich habe eine Ausnahme von Java mit dieser Ursache: Caused by: java.lang.IllegalStateException: Input row doesn't have expected number of values required by the schema. 4 fields are required while 5 values are provided.

Nun, ich eine Menge Forschung getan, und ich fand, was das Problem war, änderte ich meine ersten Teil des Codes dazu:

ClimateRdd = ClimateRdd.map(lambda x: (x[0], x[1], x[2], x[3]))  

Und es hat funktioniert!

Nun, der Punkt ist, warum der erste Teil nicht funktioniert hat? Warum muss ich manuell ein Tupel erzeugen? Gibt es eine Möglichkeit, dieses Tupel dynamisch zu erstellen?

+3

Es klingt, als hätten Sie eine Zeile in 'ClimateRDD' mit mehr als 4 Elementen. Versuchen Sie etwas wie "ClimateRdd.map (Lambda x: (1, len (x)). CountByValue()" und ich erwarte Zeilen mit 5 Elementen. – santon

+0

Versuchen Sie zu überprüfen, ob es eine Zeile gibt, die mehr als 4 enthält elements – KartikKannapur

+0

Humm, das macht Sinn! Ich werde mein dataSet überprüfen und Ihnen eine Antwort geben. Wenn ich ein Tuple konvertiere, wird es in allen Daten in RDD iterieren, wenn es 4 oder mehr hat ... wenn a do a Manuelles Tupel es ist nicht passiert. Ich werde den Datensatz überprüfen, weil ich nicht wusste, dass ich verschiedene Arten von Spalten hatte. Die Datei ist eine CSV vielleicht der Name einer Art von Land. –

Antwort

3

Das Problem war die schmutzigen Daten. Die Daten befanden sich nicht im Standard-Split-Parameter. Das Problem war da.

Wenn ich die Tupel-Konvertierung gemacht habe, nimmt das an, dass die Struktur 4 Felder entsprechend dem größten Teil der Daten hat. Aber bei einer bestimmten Linie war es nicht wahr.

Das ist also der Grund, warum mein Dataframe in Tupel-Konvertierung abstürzt.

0

Das ist ein bisschen komisch. Warum brauchen Sie Tupel? Liste funktioniert gut mit Karte.

ClimateRdd.map(lambda x: [x[0], x[1], x[2], x[3]])  
+1

Listen arbeiten s gut zu, ich weiß, dass mein Punkt ist, das Tupel manuell einzustellen. Aber, nach @ Santon Kommentar. Wahrscheinlich ist mein Problem die Größe von RDD. –

Verwandte Themen