【问题标题】:How do I batch rename columns in pyspark efficiently?如何有效地批量重命名pyspark中的列?
【发布时间】:2021-04-23 08:41:59
【问题描述】:

我正在尝试批量重命名 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 之类的东西,但我想不出最好的方法。

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

【问题讨论】:

标签: apache-spark pyspark


【解决方案1】:

没关系。想通了。本质上,我必须使用列表理解来重命名列。我正在拆分上面链接中提到的列。这就是诀窍:

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])])

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这样的事情也有帮助。这是一个类似于 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')))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-20
        • 1970-01-01
        • 2019-05-18
        • 1970-01-01
        • 2020-02-20
        • 2010-09-29
        相关资源
        最近更新 更多