Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在spark python中重命名数据帧列_Python 3.x_Apache Spark_Pyspark_Databricks - Fatal编程技术网

Python 3.x 在spark python中重命名数据帧列

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

我有一个CSV标题,我想保存为拼花地板(实际上是一个三角表)

列标题中有空格,这是拼花地板无法处理的。如何将空格更改为下划线

到目前为止,我从其他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:列不可编辑


我认为这是一个常见的要求,因为拼花地板不能处理空间,但很难找到任何示例。

您需要使用
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|
#+---+----+----+

您得到异常是因为-function
regexp\u replace
返回类型为
Column
,但function
withcolumnRename
是类型为
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