私は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.
次に、dfのヘッダーをnew_names
に置き換える方法
var newDf = df
for(col <- df.columns){
newDf = newDf.withColumnRenamed(col,col.replaceAll("\\s", "_"))
}
あなたはそれをいくつかの方法でカプセル化することができますので、それはあまり汚染されません。
ベストプラクティスとして、式と不変性を優先する必要があります。 val
およびnotvar
をできるだけ使用する必要があります。
したがって、この場合はfoldLeft
演算子を使用することをお勧めします。
val newDf = df.columns
.foldLeft(df)((curr, n) => curr.withColumnRenamed(n, n.replaceAll("\\s", "_")))
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()
あなたは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))))
お役に立てれば !!