2016-08-05 25 views
6

Ich möchte Namen von zwei Spalten ändern mit Funken mit ColumnRenamed Funktion. Natürlich kann ich schreiben:PySpark - benenne mehr als eine Spalte mit withColumnRenamed

data = sqlContext.createDataFrame([(1,2), (3,4)], ['x1', 'x2']) 
data = (data 
     .withColumnRenamed('x1','x3') 
     .withColumnRenamed('x2', 'x4')) 

aber ich möchte diesen Schritt in einem tun (Liste/Tupel neuer Namen haben). Leider weder diese:

data = data.withColumnRenamed(['x1', 'x2'], ['x3', 'x4']) 

noch dies:

data = data.withColumnRenamed(('x1', 'x2'), ('x3', 'x4')) 

arbeitet. Ist es möglich, dies so zu machen?

Antwort

16

Es ist nicht möglich, withColumnRenamed zu verwenden. Sie können allerdings toDF Methode verwenden:

data.toDF('x3', 'x4') 

Es ist auch möglich, mit einfachen select umbenennen:

from pyspark.sql.functions import col 

mapping = dict(zip(['x1', 'x2'], ['x3', 'x4'])) 
data.select([col(c).alias(mapping.get(c, c)) for c in data.columns]) 
+0

Ich bekomme "str ist nicht aufrufbar Fehler": data.select ([col (c). Alias ​​(Zuordnung.get (c, c)) für c in data.columns]) TypeError: 'str' Objekt ist nicht aufrufbar –

2

Ich konnte es nicht leicht pyspark Lösung entweder finden, so dass nur meine eigenen gebaut, ähnlich zu Pandas '.

def rename_columns(df, columns): 
    if isinstance(columns, dict): 
     for old_name, new_name in columns.items(): 
      df = df.withColumnRenamed(old_name, new_name) 
     return df 
    else: 
     raise ValueError("'columns' should be a dict, like {'old_name_1':'new_name_1', 'old_name_2':'new_name_2'}") 

So Ihre Lösung aussehen wird data = rename_columns(data, {'x1': 'x3', 'x2': 'x4'})

Es erspart mir ein paar Zeilen Code, hoffen, dass es Ihnen zu helfen.

+0

Die akzeptierte Lösung hat bei mir nicht funktioniert. Dies machte den Trick. Vielen Dank –