有条件替换Pyspark DataFrame中的特殊字符



i作为pyspark中的数据框架DF。它具有诸如Eng小时,Eng_hours,测试APT,TEST.REST等列...

我想用下划线(_)代替列名中的空间和点。

如果替换列后,如果有任何重复项,请返回我们替换字符并连接的列名。

例如:在上面的数据框中,我们有两个列ENG小时和Eng_hours。现在,我们在第一列中用下划线替换空间后我们将获得Eng_hours,这将是第二列Eng_hours的重复。当出现这种情况时,将第一列返回Enghours。

我们如何在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)

相关内容

  • 没有找到相关文章