如何相对于其他数据框更改数据框的列名

1 dataframe apache-spark apache-spark-sql pyspark pyspark-sql

我需要使用 pysparkdf相对于其他数据df_col框更改数据框的列名

df

+----+---+----+----+
|code| id|name|work|
+----+---+----+----+
| ASD|101|John| DEV|
| klj|102| ben|prod|
+----+---+----+----+
Run Code Online (Sandbox Code Playgroud)

df_col

+-----------+-----------+
|col_current|col_updated|
+-----------+-----------+
|         id|     Row_id|
|       name|       Name|
|       code|   Row_code|
|       Work|  Work_Code|
+-----------+-----------+
Run Code Online (Sandbox Code Playgroud)

如果 df 列与 col_current 匹配,则 df 列应替换为 col_updated。例如:如果 df.id 与 df.col_current 匹配,则 df.id 应替换为 Row_id。

预期产出

Row_id,Name,Row_code,Work_code
101,John,ASD,DEV
102,ben,klj,prod
Run Code Online (Sandbox Code Playgroud)

注意:我希望这个过程是动态的。

hi-*_*zir 5

只需收集df_colas 字典:

df = spark.createDataFrame(
    [("ASD", "101" "John", "DEV"), ("klj","102", "ben", "prod")],
    ("code", "id", "name", "work")
)

df_col = spark.createDataFrame(
    [("id", "Row_id"), ("name", "Name"), ("code", "Row_code"), ("Work", "Work_Code")],
    ("col_current", "col_updated")
)

name_dict = df_col.rdd.collectAsMap()
Run Code Online (Sandbox Code Playgroud)

select与列表理解一起使用:

df.select([df[c].alias(name_dict.get(c, c)) for c in df.columns]).printSchema()
# root
#  |-- Row_code: string (nullable = true)
#  |-- Row_id: string (nullable = true)
#  |-- Name: string (nullable = true)
#  |-- work: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)

name_dict标准 Python 字典在哪里:

{'Work': 'Work_Code', 'code': 'Row_code', 'id': 'Row_id', 'name': 'Name'}
Run Code Online (Sandbox Code Playgroud)

name_dict.get(c, c) 获取新名称、给定的当前名称或当前名称(如果不匹配):

name_dict.get("code", "code")
# 'Row_code'

name_dict.get("work", "work")  # Case sensitive 
# 'work'
Run Code Online (Sandbox Code Playgroud)

alias刚刚重命名(列df[col]),以名字从返回name_dict.get