Python pyspark数据帧中特殊字符的条件替换

Python pyspark数据帧中特殊字符的条件替换,python,dataframe,pyspark,spark-dataframe,Python,Dataframe,Pyspark,Spark Dataframe,我在pyspark中有一个数据帧df。它有像eng hours、eng_hours、test apt、test.rest等栏目 我想用下划线替换列名中的空格和点 如果在替换列之后,如果存在任何重复项,则返回用于替换字符并将其连接的列名 例如:在上面的数据框中,我们有两列eng hours和eng_hours。现在,我们将第一列中的空格替换为下划线 我们将得到eng_hours,它将复制到第二列eng_hours。出现这种情况时,将第一列返回为 英格小时 我们如何在pyspark中实现这一点。做了

我在pyspark中有一个数据帧df。它有像eng hours、eng_hours、test apt、test.rest等栏目

我想用下划线替换列名中的空格和点

如果在替换列之后,如果存在任何重复项,则返回用于替换字符并将其连接的列名

例如:在上面的数据框中,我们有两列eng hours和eng_hours。现在,我们将第一列中的空格替换为下划线 我们将得到eng_hours,它将复制到第二列eng_hours。出现这种情况时,将第一列返回为 英格小时


我们如何在pyspark中实现这一点。

做了一个小小的更改,以包含列名重复部分,请尝试这个

>>> from pyspark.sql.types import *
>>>import re
>>> l=[('val1','val2','val3'),('val4','val5','val6')]
>>> l_schema = StructType([StructField("eng hours",StringType(),True),StructField("eng_hours",StringType(),True),StructField("test.apt",StringType(),True)])
>>> rdd = sc.parallelize(l)
>>> df = sqlContext.createDataFrame(rdd,l_schema)
>>> reps=('.','_'),(' ','_')
>>> df.printSchema()
root
 |-- eng hours: string (nullable = true)
 |-- eng_hours: string (nullable = true)
 |-- test.apt: string (nullable = true)

>>> colnames = df.schema.names

>>> def colrename(x):
...      newcol = reduce(lambda a,kv : a.replace(*kv),reps,x)
...      return re.sub('[. ]','',x) if newcol in colnames else newcol

>>> for i in colnames:
...       df = df.withColumnRenamed(i,colrename(i))
>>> df.printSchema()
root
 |-- enghours: string (nullable = true)
 |-- eng_hours: string (nullable = true)
 |-- test_apt: string (nullable = true)

试着根据这个答案,@suresh我已经看过了这个链接。它会替换字符,但替换后出现重复字符是我要寻找的。如果在替换列之后,如果有任何重复项,则返回替换字符并连接它的列名。如果reps=''''-',''''.','''''.''''.''''.'''.''''.'''.'''.''''.'''.'''.'''.'''.'''.'''}',然后返回re.sub[,,,,'.'.'.'.'.'.'.'.''.''''.'.'.''''.'''''''.'''''''''。你会用“u”来代替偏执还是如代表所示。?如果它是在reps中给出的,那么它们将仅处于连接状态。那你想怎么样?弄明白我想要什么谢谢