web-dev-qa-db-fra.com

Nom de la colonne avec un point spark

J'essaie de prendre des colonnes d'un DataFrame et de le convertir en RDD[Vector].

Le problème est que j'ai des colonnes avec un "point" dans leur nom comme jeu de données suivant:

"col0.1","col1.2","col2.3","col3.4"
1,2,3,4
10,12,15,3
1,12,10,5

Voilà ce que je fais:

val df = spark.read.format("csv").options(Map("header" -> "true", "inferSchema" -> "true")).load("C:/Users/mhattabi/Desktop/donnee/test.txt")
val column=df.columns.map(c=>s"`${c}`")
val rows = new VectorAssembler().setInputCols(column).setOutputCol("vs")
  .transform(df)
  .select("vs")
  .rdd
val data =rows.map(_.getAs[org.Apache.spark.ml.linalg.Vector](0))
  .map(org.Apache.spark.mllib.linalg.Vectors.fromML)

val mat: RowMatrix = new RowMatrix(data)
//// Compute the top 5 singular values and corresponding singular vectors.
val svd: SingularValueDecomposition[RowMatrix, Matrix] = mat.computeSVD(mat.numCols().toInt, computeU = true)
val U: RowMatrix = svd.U  // The U factor is a RowMatrix.
val s: Vector = svd.s  // The singular values are stored in a local dense vector.
val V: Matrix = svd.V  // The V factor is a local dense matrix.

println(V)

S'il vous plaît toute aide pour me faire considérer les colonnes avec un point dans leurs noms.Merci

17
Maher HTB

Si votre problème est la .(dot) dans le nom de la colonne, vous pouvez utiliser `(backticks) pour inclure le nom de la colonne.

df.select("`col0.1`")

24
Ricardo Mutti

Le problème ici est l'implémentation de VectorAssembler, pas les colonnes en soi. Vous pouvez par exemple ignorer l'en-tête:

val df = spark.read.format("csv")
  .options(Map("inferSchema" -> "true", "comment" -> "\""))
  .load(path)

new VectorAssembler()
  .setInputCols(df.columns)
  .setOutputCol("vs")
  .transform(df)

ou renommez les colonnes avant de passer à VectorAssembler:

val renamed =  df.toDF(df.columns.map(_.replace(".", "_")): _*)

new VectorAssembler()
  .setInputCols(renamed.columns)
  .setOutputCol("vs")
  .transform(renamed)

Enfin, la meilleure approche consiste à fournir un schéma de manière explicite:

import org.Apache.spark.sql.types._

val schema = StructType((0 until 4).map(i => StructField(s"_$i", DoubleType)))

val dfExplicit = spark.read.format("csv")
  .options(Map("header" -> "true"))
  .schema(schema)
  .load(path)

new VectorAssembler()
  .setInputCols(dfExplicit.columns)
  .setOutputCol("vs")
  .transform(dfExplicit)
8
zero323