2016-10-19 5 views
0

SPÄTER BEARBEITEN: Basierend auf dieser article scheint es, dass Spark nicht bearbeiten und RDD oder Spalte. Ein neuer muss mit dem neuen Typ erstellt und der alte gelöscht werden. Die unten vorgeschlagene Methode for loop und .withColumn scheint der einfachste Weg zu sein, um die Aufgabe zu erledigen.Überschreiben Spark Datenrahmen Schema

ORIGINAL FRAGE: Gibt es eine einfache Möglichkeit (für Mensch und Maschine), mehrere Spalten in einen anderen Datentyp zu konvertieren?

Ich habe versucht, das Schema manuell zu definieren, dann laden Sie die Daten aus einer Parkett-Datei mit diesem Schema und speichern sie in einer anderen Datei, aber ich bekomme "Job abgebrochen." auf jedem DF. Etwas einfach für mich, mühsam für Spark ... und es funktioniert nicht.

Eine weitere Option ist mit:

df = df.withColumn("new_col", df("old_col").cast(type)).drop("old_col").withColumnRenamed("new_col", "old_col") 

Ein bisschen mehr Arbeit für mich, da es nahe 100 Spalten und, wenn Funken jede Spalte im Speicher zu kopieren hat, dann ist das nicht optimal entweder klingt. Gibt es einen leichteren Weg?

Antwort

2

Je nachdem, wie kompliziert die Guss Regeln sind, können Sie erreichen, was Sie mit dieser Schleife fragen:

scala> var df = Seq((1,2),(3,4)).toDF("a", "b") 
df: org.apache.spark.sql.DataFrame = [a: int, b: int] 

scala> df.show 
+---+---+ 
| a| b| 
+---+---+ 
| 1| 2| 
| 3| 4| 
+---+---+ 

scala> import org.apache.spark.sql.types._ 
import org.apache.spark.sql.types._ 

scala> > df.columns.foreach{c => df = df.withColumn(c, df(c).cast(DoubleType))} 

scala> df.show 
+---+---+ 
| a| b| 
+---+---+ 
|1.0|2.0| 
|3.0|4.0| 
+---+---+ 

Dies sollte wie jede andere Spalte Betrieb so effizient sein.

+1

Die Säulen sind nicht alle vom gleichen Typ, so muss ich noch eine Liste von Tupeln verwenden. Trotzdem, aus irgendeinem Grund habe ich mir nicht vorgestellt, dass man eine Spalte mit "withColumn" überschreiben kann :) also danke dafür, es schont die Drop- und Rename-Teile. – UrVal

+0

Dann ja, ich denke, eine 'foreach' über die' (name, type) 'Paare wäre die beste Option. –

Verwandte Themen