scala 替换Spark Dataframe中所有列名中的空格

xjreopfe  于 2022-11-09  发布在  Scala
关注(0)|答案(7)|浏览(365)

我在一些列名中使用了带有空格的 Dataframe ,必须用下划线替换。
我知道可以在spkSQL中使用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的头部

0aydgbwb

0aydgbwb1#

作为最佳实践,您应该更喜欢表达式和不变性。您应该尽量使用val而不是var
因此,最好使用foldLeft运算符,在本例中:

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

dly7yett2#

var newDf = df
  for(col <- df.columns){
    newDf = newDf.withColumnRenamed(col,col.replaceAll("\\s", "_"))
  }

你可以用某种方法把它封装起来,这样它就不会有太多的污染。

nwlls2ji

nwlls2ji3#

在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()
yquaqz18

yquaqz184#

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

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

ie3xauqp5#

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

希望这能有所帮助!!

pw9qyyiw

pw9qyyiw6#

我还想添加此解决方案

import re
for each in df.schema.names:
    df = df.withColumnRenamed(each, re.sub(r'\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*','',each.replace(' ', '')))
w8rqjzmb

w8rqjzmb7#

这是我们正在使用的实用程序。

def columnsStandardise(df: DataFrame): DataFrame = {
    val dfcolumnsStandardise= df.toDF(df.columns map (_.toLowerCase().trim().replaceAll(" ","_")): _*)
    (dfcolumnsStandardise)
  }

相关问题