2016-08-05 22 views
6

के साथ एक से अधिक कॉलम का नाम बदलें, मैं कॉलमरनामयुक्त फ़ंक्शन के साथ स्पार्क का उपयोग करके दो कॉलम के नाम बदलना चाहता हूं। बेशक, मैं लिख सकते हैं:पायस्पार्क - कॉलमरेनामेड

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

लेकिन मैं (होने नए नामों की सूची/टपल) एक ही चरण में ऐसा करना चाहते हैं। दुर्भाग्य से, न तो इस:

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

है और न ही इस:

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

काम कर रहा है। क्या ऐसा इस तरह से करना संभव है?

उत्तर

16

withColumnRenamed का उपयोग करना संभव नहीं है। आप toDF विधि हालांकि उपयोग कर सकते हैं:

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

मैं "str प्रतिदेय त्रुटि नहीं है": data.select ([col (ग) ​​.alias (mapping.get (ग, ग)) data.columns में ग के लिए]) लेखन त्रुटि: 'str' ऑब्जेक्ट कॉल करने योग्य नहीं है –

2

मैं नहीं एक आसान pyspark समाधान या तो अपने ही एक मिल सकता है, तो बस का निर्माण किया है, इसी तरह:

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

यह भी संभव सरल select साथ नाम बदलने के लिए है पांडा ' पर।

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

तो अपने समाधान देखने data = rename_columns(data, {'x1': 'x3', 'x2': 'x4'}) तरह

यह मेरे कोड की कुछ पंक्तियाँ बचाता है, आशा है कि यह आप भी मदद मिलेगी होगा।

+0

स्वीकार्य समाधान मेरे लिए काम नहीं करता है। इसने चाल बनाई। धन्यवाद –

संबंधित मुद्दे