Python 3.x 在spark python中重命名数据帧列
我有一个CSV标题,我想保存为拼花地板(实际上是一个三角表) 列标题中有空格,这是拼花地板无法处理的。如何将空格更改为下划线 到目前为止,我从其他so帖子中拼凑了以下内容:Python 3.x 在spark python中重命名数据帧列,python-3.x,apache-spark,pyspark,databricks,Python 3.x,Apache Spark,Pyspark,Databricks,我有一个CSV标题,我想保存为拼花地板(实际上是一个三角表) 列标题中有空格,这是拼花地板无法处理的。如何将空格更改为下划线 到目前为止,我从其他so帖子中拼凑了以下内容: from pyspark.sql.functions import * df = spark.read.option("header", True).option("delimiter","\u0001").option("inferSchema&quo
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:列不可编辑
我认为这是一个常见的要求,因为拼花地板不能处理空间,但很难找到任何示例。您需要使用
reduce
函数迭代地将重命名应用于数据帧,因为在您的代码中df2
将只重命名最后一列
代码如下所示(而不是循环的):
df2=reduce(lambda数据,名称:data.withColumnRename(名称,名称.replace('1','2')),
姓名(df)
使用.toDF
(或)。选择
并传递列列表以创建新的数据帧
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|
#+---+----+----+
您得到异常是因为-functionregexp\u replace
返回类型为Column
,但functionwithcolumnRename
是类型为String
的异常
def regexp_replace(e: org.apache.spark.sql.Column,pattern: String,replacement: String): org.apache.spark.sql.Column
您可以尝试使用select:df.select([col(a).alias(b)表示a,b在zip中(df.columns,[re.sub(“,”,i)表示df.columns]))
Great。我只需要将functools import reduce中的添加到这个列表的顶部。到目前为止,这正是我想要做的-我将只检查其他一些。在这种情况下,reduce
函数接受三个参数:lambda函数、names和df?它似乎将names
传递给name
参数,df
传递给data
参数?试图理解这里发生了什么我看到的所有reduce示例都有两个参数?好的,这里有一些很好的示例,展示了两种方法(reduce和loop),感谢您的输入。我还没有试过你的答案,但我相信我会回来的。
def withColumnRenamed(existingName: String,newName: String): org.apache.spark.sql.DataFrame