如何有效地在pyspark中批量重命名列?

时间:2019-06-21 16:34:42

标签: apache-spark pyspark

我正在尝试从以下位置批量重命名PySpark中的列:

 'collect_list(Target_Met_1)[1]' --> 'AB11'
 'collect_list(Target_Met_1)[2]' --> 'AB12'
 'collect_list(Target_Met_2)[1]' --> 'AB21'
 'collect_list(Target_Met_1)[150]' --> 'AB150'

如何以编程方式进行处理?现在,我可以使用以下方式手动更改名称:

df.withColumnRenamed('collect_list(Target_Met_1)[1]', 'AB11')

但是,如果我有500列,则效率不高。我意识到,重命名的另一种方法是使用udf之类的方法,但是我找不到最佳的方法。

我已经拆分了列,这不是问题。问题在于重命名该列。

3 个答案:

答案 0 :(得分:0)

没关系。想通了。本质上,我必须使用列表推导来重命名列。我正在拆分上面链接中提到的列。这就是解决问题的方法:

df = df.select('1', '2', '3', *[df[col][i].alias("AB" + str(i + 1) + col) for col in columns for i in range(max_dict[col])])

答案 1 :(得分:0)

要重命名所有列,您可以使用 toDf 方法:

import re

df.toDF(*['AB' + ''.join(re.findall('\d+', i)) for i in df.columns])

答案 2 :(得分:0)

这样的事情也有帮助。这是一个类似于 Pandas 重命名功能的重命名功能。

def rename_cols(map_dict):
  """
  Rename a bunch of columns in a data frame
  :param map_dict: Dictionary of old column names to new column names
  :return: Function for use in transform
  """
  def _rename_cols(df):
    for old, new in map_dict.items():
      df = df.withColumnRenamed(old, new)
    return df
  return _rename_cols

你可以像这样使用它

spark_df.transform(rename_cols(dict(old1='new1', old2='new2', old3='new3')))