2015-10-08 18 views
7

Gibt es eine bessere Möglichkeit, alle oder mehrere Spalten zur gleichen Zeit einer bestimmten SparkSQL DataFrame voranzustellen oder umzubenennen als mehrere Male dataFrame.withColumnRenamed() aufrufen?Spark DataFrame und Umbenennen mehrerer Spalten (Java)

Ein Beispiel wäre, wenn ich Änderungen (mit voller Outer Join) erkennen möchte. Dann bin ich mit zwei DataFrame s mit der gleichen Struktur verlassen.

Antwort

6

Ich empfehle die select() -Methode, um dies durchzuführen. Tatsächlich verwendet die columnRenamed() -Methode select() für sich. Hier ist beispielsweise, wie mehrere Spalten umbenennen:

import org.apache.spark.sql.functions._ 

val someDataframe: DataFrame = ... 

val initialColumnNames = Seq("a", "b", "c") 
val renamedColumns = initialColumnNames.map(name => col(name).as(s"renamed_$name")) 
someDataframe.select(renamedColumns : _*) 
+0

Es ist mehr über Java API und Spark. Als Beispiel erwartet 'select' entweder einen String-Parameter und dann varargs oder ein Array von' Column's, was nicht konsistent und manchmal auch ein wenig nervig ist. Ich musste einige Hilfsmethoden erstellen, um mit diesem Problem umzugehen, aber es wäre besser, diese Methoden direkt in 'DataFrame' verfügbar zu haben. – JiriS

+0

Es gibt ein anderes Beispiel [hier] (http://stackoverflow.com/questions/32535273/how-to-match-dataframe-column-names-to-scala-case-class-attributes) –

+0

Haben Sie Ihren Code mit versucht Funken 2.0? Ich habe es mit 7000 Spalten zu tun, siehe https://github.com/ramhiser/datamicroarray/wiki/Golub-(1999). Es dauert ewig (= nie beendet, bevor meine Geduld zu Ende war). – Boern

0

ich heve habe gerade die Antwort

df1_r = df1.select(*(col(x).alias(x + '_df1') for x in df1.columns)) 

bei stackoverflow here (siehe das Ende der akzeptierte Antwort)

-1

Obwohl es nicht die Antwort auf Ihre Frage direkt, aber ich aktualisiere Spaltennamen immer einzeln. Da es nur DF Metadaten aktualisiert, gibt es keinen Schaden (keine Auswirkungen auf die Leistung) auf die Aktualisierung Spaltennamen nacheinander, z.B .:

for c in DF.columns: 
    new_c = c.strip().replace(' ','_') 
    DF = DF.withColumnRenamed(c, new_c) 
+0

Kein Schaden? Hast du das für Hunderte von Spalten probiert? Ich habe es getan und der Job ist nach drei Stunden mit einem Stackoverflow-Fehler fehlgeschlagen. Die angenommene Antwort hat stattdessen die Umbenennung von Hunderten von Spalten sofort vorgenommen. –

+0

Ja, ich habe das getestet. Welche Spark-Version? Ich benutzte das auf einem Tisch mit über 700 Spalten. In Spark 1.5/CDH 5.5. Auch hier aktualisiert DF.withColumnRenamed nur die Metadaten von DF, so dass es sehr schnell geht. Sind Sie sicher, dass es der Start-Flow ist? Es könnte ein Spark-Bug sein, zu dem Sie gerade laufen. Bitte legen Sie den vollständigen Code vor. Ich bin mir sicher, dass Code funktioniert, ich habe ihn in unseren Produktionsjobs verwendet. – Tagar

+0

Ich habe 'Spark 1.6.2' und Scala anstelle von Java benutzt. Sind DataFrames in Java änderbar und wird bei jeder Iteration keine neue Instanz erstellt? Wenn ja, würde es erklären, warum es für Sie funktioniert. –

0
or (a <- 0 to newsales.columns.length - 1) 
{ 
var new_c = newsales.columns(a).replace('(','_').replace(')',' ').trim 
newsales_var = newsales.withColumnRenamed(newsales.columns(a),new_c) 
} 
+0

Bitte bearbeiten Sie mit mehr Informationen. Code-only und "try this" Antworten werden abgeraten, da sie keine durchsuchbaren Inhalte enthalten und nicht erklären, warum jemand "das versuchen sollte". Wir bemühen uns, eine Ressource für Wissen zu sein. – abarisone

Verwandte Themen