2016-08-05 24 views
6

Tôi muốn thay đổi tên của hai cột sử dụng chức năng spark withColumnRenamed. Tất nhiên, tôi có thể viết:PySpark - đổi tên nhiều hơn một cột bằng withColumnRenamed

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

nhưng tôi muốn làm điều này trong một bước (có danh sách/tuple tên mới). Thật không may, không là cái này:

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

hay này:

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

đang làm việc. Có thể làm điều này theo cách đó không?

Trả lời

16

Nó không phải là có thể sử dụng withColumnRenamed. Bạn có thể sử dụng phương pháp toDF mặc dù:

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

Nó cũng có thể đổi tên với đơn giản select:

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

Tôi nhận được "str không phải là lỗi có thể gọi": data.select ([col (c) .alias (mapping.get (c, c)) cho c trong data.columns]) TypeError: 'str' object không gọi được –

2

tôi không thể tìm thấy một giải pháp dễ dàng pyspark một trong hai, vì vậy chỉ cần xây dựng một của riêng tôi, tương tự để gấu trúc '.

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'}") 

Vì vậy, giải pháp của bạn sẽ trông giống như data = rename_columns(data, {'x1': 'x3', 'x2': 'x4'})

Nó tiết kiệm cho tôi một số dòng mã, hy vọng nó sẽ giúp bạn quá.

+0

Giải pháp được chấp nhận không hoạt động đối với tôi. Điều này làm cho các trick. Cảm ơn –

Các vấn đề liên quan