使用 .withColumnRenamed
来重命名,直接看demo:
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("example").getOrCreate()
data = [
("Alice", 1, 200),
("Bob", 2, 300),
("Charlie", 3, 400),
]
columns = ["name", "old_col1", "old_col2"]
df = spark.createDataFrame(data=data, schema=columns)
df.show()
'''
+-------+--------+--------+
| name|old_col1|old_col2|
+-------+--------+--------+
| Alice| 1| 200|
| Bob| 2| 300|
|Charlie| 3| 400|
+-------+--------+--------+
'''
df_rename = df.withColumnRenamed("old_col1", "new_col1").withColumnRenamed(
"old_col2", "new_col2"
)
df_rename.show()
'''
+-------+--------+--------+
| name|new_col1|new_col2|
+-------+--------+--------+
| Alice| 1| 200|
| Bob| 2| 300|
|Charlie| 3| 400|
+-------+--------+--------+
'''
这个 .withColumnRenamed
和 .withColumn
二者有什么不同呢?
1. df.withColumn
withColumn
方法用于向 DataFrame
中添加一个新列或替换现有列。
这个方法需要两个参数:新列的名称和一个 Column 表达式,该表达式定义了新列的值。如果新列的名称已经存在于 DataFrame 中,那么该列将被替换。
from pyspark.sql import SparkSession
from pyspark.sql.functions import lit
spark = SparkSession.builder.appName("example").getOrCreate()
data = [("Alice", 1), ("Bob", 2), ("Charlie", 3)]
columns = ["name", "age"]
df = spark.createDataFrame(data=data, schema=columns)
# 使用 withColumn 添加一个新列
df_with_new_column = df.withColumn("new_column", lit("constant_value"))
# 使用 withColumn 替换现有列
df_replaced_column = df.withColumn("age", df["age"] * 2) # 将 age 列的值翻倍
df_with_new_column.show()
df_replaced_column.show()
2. df.withColumnRenamed
withColumnRenamed
方法专门用于重命名 DataFrame 中的现有列。它接受两个参数:要重命名的列的当前名称和新名称。
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("example").getOrCreate()
data = [("Alice", 1), ("Bob", 2), ("Charlie", 3)]
columns = ["name", "age"]
df = spark.createDataFrame(data=data, schema=columns)
# 使用 withColumnRenamed 重命名列
df_renamed = df.withColumnRenamed("age", "years_old")
df_renamed.show()
3. 区别与联系
1. 区别:
- withColumn 可以添加新列或替换现有列,而 withColumnRenamed 仅用于重命名现有列。
- withColumn 需要一个 Column 表达式来定义新列的值,而 withColumnRenamed 只需要新列的名称。
2. 联系:
- 两者都是 DataFrame 的转换操作,返回一个新的 DataFrame,而不修改原始 DataFrame。
- 两者都可以用于修改 DataFrame 的结构,即列的组成。
- 在某些情况下,你可以通过组合使用这两个方法来实现更复杂的列操作。例如,你可以先使用 withColumn 添加一个新列,然后使用 withColumnRenamed 来重命名它。