在spark python中重命名Dataframe列

jjhzyzn0  于 2021-05-29  发布在  Spark
关注(0)|答案(3)|浏览(527)

我有一个csv标题,我想保存为Parquet(实际上是一个三角表)
列标题中有空格,这是Parquet地板无法处理的。如何将空格改为下划线?
这是我迄今为止从其他so帖子中拼凑出来的:

from pyspark.sql.functions import *

df = spark.read.option("header", True).option("delimiter","\u0001").option("inferSchema",True).csv("/mnt/landing/MyFile.TXT")

names = df.schema.names
for name in names:
    df2 = df.withColumnRenamed(name,regexp_replace(name, ' ', '_'))

当我运行此命令时,最后一行显示以下错误:
typeerror:列不可编辑
我认为这将是一个共同的要求,因为Parquet地板不能处理空间,但这是很难找到任何例子。

ruyhziif

ruyhziif1#

你得到异常是因为-函数 regexp_replace 返回类型 Column 但是功能 withColumnRenamed 是类型例外 String .

def regexp_replace(e: org.apache.spark.sql.Column,pattern: String,replacement: String): org.apache.spark.sql.Column
def withColumnRenamed(existingName: String,newName: String): org.apache.spark.sql.DataFrame
o7jaxewo

o7jaxewo2#

使用 .toDF (或) .select 并传递列列表以创建新的Dataframe。

df.show()

# +---+----+----+

# | id|id a|id b|

# +---+----+----+

# |  1|   a|   b|

# |  2|   c|   d|

# +---+----+----+

new_cols=list(map(lambda x: x.replace(" ", "_"), df.columns))

df.toDF(*new_cols).show()

df.select([col(s).alias(s.replace(' ','_')) for s in df.columns]).show()

# +---+----+----+

# | id|id_a|id_b|

# +---+----+----+

# |  1|   a|   b|

# |  2|   c|   d|

# +---+----+----+
pkwftd7m

pkwftd7m3#

你需要使用 reduce 函数对Dataframe迭代应用重命名,因为在代码中 df2 将只重命名最后一列。。。
代码如下所示(而不是 for 循环):

df2 = reduce(lambda data, name: data.withColumnRenamed(name, name.replace('1', '2')), 
             names, df)

相关问题