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

时间:2017-03-14 18:12:28

标签: python dataframe pyspark spark-dataframe

我在pyspark中有数据框df。它有像eng hours,eng_hours,test apt,test.rest等等的列......

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

如果在替换列之后有任何重复项,则返回我们替换字符的列名并将其连接起来。

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

我们如何在pyspark实现这一目标。

1 个答案:

答案 0 :(得分:1)

包含列名重复部分的小改动,请尝试此操作,

>>> 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)