2015-10-08 4 views
7

Esiste un modo migliore per aggiungere o rinominare tutte o più colonne contemporaneamente a SparkSQL dato DataFrame piuttosto che chiamare più volte dataFrame.withColumnRenamed()?Spark DataFrame e ridenominazione di più colonne (Java)

Un esempio sarebbe se voglio rilevare le modifiche (utilizzando il join esterno completo). Poi sono rimasto con due DataFrame s con la stessa struttura.

risposta

6

Suggerisco di utilizzare il metodo select() per eseguire questa operazione. Infatti il ​​metodo withColumnRenamed() usa select() da solo. Ecco ad esempio come rinominare più colonne:

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

E 'più di API Java e Spark. Ad esempio, 'select' si aspetta un parametro String e quindi varargs o array di' Column's che non è coerente e talvolta un po 'fastidioso da usare. Ho dovuto creare alcuni metodi di supporto per affrontare questo problema, ma sarebbe meglio avere quei metodi direttamente disponibili in 'DataFrame'. – JiriS

+0

C'è un altro esempio [qui] (http://stackoverflow.com/questions/32535273/how-to-match-dataframe-column-names-to-scala-case-class-attributes) –

+0

Hai provato il tuo codice con Spark 2.0? Ho a che fare con 7000 colonne, vedi https://github.com/ramhiser/datamicroarray/wiki/Golub-(999). Ci vuole sempre (= non è mai finito prima che la mia pazienza fosse finita). – Boern

0

ho Hève appena trovato la risposta

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

a stackoverflow here (vedere la fine della risposta accettata)

-1

Anche se non risponde alla tua domanda direttamente, ma aggiorno sempre i nomi delle colonne uno per uno. Dal momento che aggiorna solo i metadati DF, non v'è nulla di male (senza impatto sulle prestazioni) sull'aggiornamento nomi delle colonne uno per uno, per es .:

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

Nessun danno? Hai provato questo per centinaia di colonne? Ho fatto e il lavoro è fallito con un errore di stackoverflow dopo tre ore. La risposta accettata invece ha cambiato il nome di centinaia di colonne all'istante. –

+0

Sì, l'ho provato. Quale versione di Spark? L'ho usato su un tavolo con oltre 700 colonne. In Spark 1.5/CDH 5.5. Ancora una volta, DF.withColumnRenamed aggiorna solo i metadati di DF, quindi è molto veloce. Sei sicuro che sia quella parte che ti dà startoverflow? Potrebbe essere un bug Spark a cui stai correndo. Si prega di inserire il codice completo. Sono sicuro che il codice funzioni, l'ho usato nei nostri lavori di produzione. – Tagar

+0

Ho usato 'Spark 1.6.2' e Scala invece di Java. DataFrames è mutabile in Java e non crea una nuova istanza ad ogni iterazione? Se è così, spiegherebbe perché funziona per te. –

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

Si prega di modificare con ulteriori informazioni. Le risposte solo per codice e "prova questo" sono scoraggiate, perché non contengono contenuti ricercabili e non spiegano perché qualcuno dovrebbe "provare questo". Facciamo uno sforzo qui per essere una risorsa per la conoscenza. – abarisone