使用模式更改 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 数据框标头名称的主要内容,如果未能解决你的问题,请参考以下文章