替换spark Dataframe中所有列名中的空格

Replacing whitespace in all column names in spark Dataframe

我的 spark 数据框在一些列名中有空格,必须用下划线替换。

我知道可以在 sparkSQL 中使用 withColumnRenamed() 重命名单个列,但要重命名 'n' 列数,此函数必须链接 'n' 次(据我所知) .

为了自动化这个,我试过:

val old_names = df.columns()        // contains array of old column names

val new_names = old_names.map { x => 
   if(x.contains(" ") == true) 
      x.replaceAll("\s","_") 
   else x 
}                    // array of new column names with removed whitespace.

现在,如何用 new_names

替换 df 的 header

在Python中,可以通过以下代码完成:

# Importing sql types
from pyspark.sql.types import StringType, StructType, StructField
from pyspark.sql.functions import col

# Building a simple dataframe:
schema = StructType([
             StructField("id name", StringType(), True),
             StructField("cities venezuela", StringType(), True)
         ])

column1 = ['A', 'A', 'B', 'B', 'C', 'B']
column2 = ['Maracaibo', 'Valencia', 'Caracas', 'Barcelona', 'Barquisimeto', 'Merida']

# Dataframe:
df = sqlContext.createDataFrame(list(zip(column1, column2)), schema=schema)
df.show()

exprs = [col(column).alias(column.replace(' ', '_')) for column in df.columns]
df.select(*exprs).show()
  var newDf = df
  for(col <- df.columns){
    newDf = newDf.withColumnRenamed(col,col.replaceAll("\s", "_"))
  }

你可以用一些方法封装它,这样就不会造成太大的污染。

作为最佳实践,您应该更喜欢表达式和不变性。 您应该尽可能使用 val 而不是 var

因此,最好使用 foldLeft 运算符,在这种情况下:

val newDf = df.columns
              .foldLeft(df)((curr, n) => curr.withColumnRenamed(n, n.replaceAll("\s", "_")))

您可以在 python 中执行完全相同的操作:

raw_data1 = raw_data
for col in raw_data.columns:
  raw_data1 = raw_data1.withColumnRenamed(col,col.replace(" ", "_"))

在 Scala 中,这是另一种实现相同的方法 -

    import org.apache.spark.sql.types._

    val df_with_newColumns = spark.createDataFrame(df.rdd, 
StructType(df.schema.map(s => StructField(s.name.replaceAll(" ", ""), 
s.dataType, s.nullable))))

希望对您有所帮助!!