如何将DataFrame列名转为小写且不修改值?含Spark SQL与DataFrame方案
没问题,这就给你两种靠谱的实现方案,确保只修改列名的大小写,完全不改动DataFrame里的数据内容:
一、DataFrame API 方法(推荐,更贴合Spark的DataFrame操作习惯)
这种方法直接通过DataFrame的API批量重命名列,代码简洁高效:
# 假设你的目标DataFrame名为df df_lower_cols = df.select([col(c).alias(c.lower()) for c in df.columns])
代码说明:
- 遍历原DataFrame的所有列名
df.columns - 对每个列
col(c),用alias(c.lower())将其重命名为小写版本 - 最后通过
select()生成新的DataFrame,所有数据内容保持原样,仅列名转为小写
举个直观的例子:如果原df的列是["USER_ID", "USER_NAME", "REG_DATE"],执行后新df的列会变成["user_id", "user_name", "reg_date"],对应的数据完全不受影响。
二、原生Spark SQL 方法
如果更习惯用SQL语句操作,可以先把DataFrame注册成临时视图,再通过动态生成的SQL完成列名转换:
# 1. 将原DataFrame注册为临时视图 df.createOrReplaceTempView("temp_upper_table") # 2. 动态生成SELECT子句(适配数百列的场景,避免手动编写) select_clause = ", ".join([f"`{c}` AS {c.lower()}" for c in df.columns]) # 3. 执行Spark SQL得到结果 df_lower_cols = spark.sql(f"SELECT {select_clause} FROM temp_upper_table")
代码说明:
- 第一步把DataFrame注册成临时视图后,就可以用SQL语法查询它
- 动态生成
SELECT子句是为了适配大量列的场景,用列表推导式把每个大写列名转换为原列名 AS 小写列名的格式;这里用反引号包裹原列名,是为了防止列名包含特殊字符时触发SQL语法错误 - 执行SQL后得到的新DataFrame,就是列名小写、数据内容完全不变的结果
额外注意:
如果原DataFrame中存在大小写不同但转小写后重复的列(比如"NAME"和"Name"),两种方法都会报错——因为Spark不允许DataFrame存在重复列名。这种情况需要先处理重复列,再进行大小写转换。
内容的提问来源于stack exchange,提问作者user1870400
相关产品推荐
相关产品推荐

