使用模式更改 pyspark 数据框标头名称

Posted

技术标签:

【中文标题】使用模式更改 pyspark 数据框标头名称【英文标题】:Change pyspark dataframe header names using schema 【发布时间】:2021-03-11 10:22:31 【问题描述】:

我的 csv 文件很少,大约有 10 列,我从不同的来源获取数据,标题名称也不同。我正在尝试使用以下模式更改标题名称。

def transform(df):
   schema = StructType([StructField('Name', StringType(), True),
                        StructField('ID', IntegerType(), True),
                        StructField('Volume', DoubleType(), True),
                        StructField('GrossAmount', DoubleType(), True)])
   
    df_transform = spark.createDataFrame(data = df, schema = schema)
    return df_transform

df = transform(spark.read.csv("data1.csv", header = True, inferSchema = True))

但我得到以下错误

TypeError: data 已经是一个 DataFrame

请告诉我如何实现这一点。我想编写一个函数,因此我也可以在其他数据帧上使用它。谢谢。

【问题讨论】:

如果只想更改列名,可以使用df2 = df.toDF('Name', 'ID', ...) 读取 csv 文件时为什么不传递架构? df.read.csv(..., schema=custom_schema) 【参考方案1】:

您可以在文件读取级别定义架构。

mySchema = StructType([StructField('Name', StringType(), True),
                        StructField('ID', IntegerType(), True),
                        StructField('Volume', DoubleType(), True),
                        StructField('GrossAmount', DoubleType(), True)])
   
df = spark.read.csv("data1.csv", header = True, schema = mySchema)

如您所见,数据已经是一个数据框,因此如果您尝试通过此命令创建数据框,则会出现错误。

spark.createDataFrame(data = df, schema = schema)

另外说明,python UDF 的性能成本很高,因此如果您可以使用 spark 功能而不是 UDF,建议您避免使用。

【讨论】:

以上是关于使用模式更改 pyspark 数据框标头名称的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Pyspark 数据框标头设置为另一行?

我只需要在 pyspark 数据框中附加那些具有非空值的人

如何使用其模式从 Pyspark 数据框创建配置单元表?

从 pyspark 中的字典列创建数据框

pyspark 使用名称中的变量将数据框保存到配置单元表

如何在 pySpark 中有效地从字符串数据框中替换多个正则表达式模式的所有实例?