使用 Pyspark 动态重命名数据框列

Posted

技术标签:

【中文标题】使用 Pyspark 动态重命名数据框列【英文标题】:Dynamically renaming dataframe columns using Pyspark 【发布时间】:2021-04-26 19:32:11 【问题描述】:

我正在读取一个文件,其中列有值时可以是结构,而没有数据时可以是字符串。内联示例assigned_to 和group 是struct 并且有数据。

root
 |-- number: string (nullable = true)
 |-- assigned_to: struct (nullable = true)
 |    |-- display_value: string (nullable = true)
 |    |-- link: string (nullable = true)
 |-- group: struct (nullable = true)
 |    |-- display_value: string (nullable = true)
 |    |-- link: string (nullable = true)

为了展平 JSON,我正在执行以下操作,

df23 = spark.read.parquet("dbfs:***/test1.parquet")
val_cols4 = []

#the idea is the day when the data type of the columns in struct I dynamically extract values otherwise create new columns and default to None.
for name, cols in df23.dtypes:
  if 'struct' in cols:
    val_cols4.append(name+".display_value") 
  else:
    df23 = df23.withColumn(name+"_value", lit(None))

现在,如果我必须使用 val_cols4 从数据框 df23 中进行选择,所有结构列都具有相同的名称“display_value”。

root
 |-- display_value: string (nullable = true)
 |-- display_value: string (nullable = true)

如何将列重命名为适当的值?我尝试了以下,

for name, cols in df23.dtypes:
  if 'struct' in cols:
    val_cols4.append("col('"+name+".display_value').alias('"+name+"_value')") 
  else:
    df23 = df23.withColumn(name+"_value", lit(None))

当我对数据框进行选择时,这不起作用并出错。

【问题讨论】:

【参考方案1】:

您可以将别名列对象而不是字符串附加到val_cols4,例如

from pyspark.sql.functions import col, lit

val_cols4 = []

for name, cols in df23.dtypes:
  if 'struct' in cols:
    val_cols4.append(col(name+".display_value").alias(name+"_value")) 
  else:
    df23 = df23.withColumn(name+"_value", lit(None))

然后你可以选择列,例如

newdf = df23.select(val_cols4)

【讨论】:

以上是关于使用 Pyspark 动态重命名数据框列的主要内容,如果未能解决你的问题,请参考以下文章

使用 pandas 重命名数据框列中的元素

重命名由当前名称引用的多个数据框列

r R重命名数据框列

KeyError:重命名数据框列后为 1.0

在 spark python 中重命名数据框列

Pandas df.itertuples 在打印时重命名数据框列