替换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))))
希望对您有所帮助!!
我的 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
在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))))
希望对您有所帮助!!