web-dev-qa-db-ja.com

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.

次に、dfのヘッダーをnew_namesに置き換える方法

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

あなたはそれをいくつかの方法でカプセル化することができますので、それはあまり汚染されません。

16
Igor Berman

ベストプラクティスとして、式と不変性を優先する必要があります。 valおよびnotvarをできるだけ使用する必要があります。

したがって、この場合はfoldLeft演算子を使用することをお勧めします。

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

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()
12
Hugo Reyes

あなたはPythonでまったく同じことをすることができます:

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

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

お役に立てれば !!

0
Ajay Ahuja