4

我試圖從DataFrame取得列並將其轉換爲RDD[Vector]帶點火花的列名​​稱

的問題是,我已經列在他們的名字一個「點」爲以下數據集:

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

這是我在做什麼:

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) 

請任何幫助讓我考慮他們的名字中有圓點的列。謝謝

+0

你嘗試改變列名? –

+0

@RameshMaharjan它與列的無縫工作,但我需要解決它與點,任何幫助thnx –

+0

我會建議是保存模式的點,改變列名稱,並在完成後,新列名改回來帶點。這不正常嗎? –

回答

3

這裏的問題是VectorAssembler的實現,而不是列本身。例如,您可以忽略標題:

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

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

或傳遞到VectorAssembler之前重命名列:

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

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

最後,最好的辦法是明確規定的模式:

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

JIRA的主題? – eliasah

+0

@ zero323我感謝你的幫助,你的意思是沒有其他解決方案來處理這個問題,同時保持相同的列名稱?謝謝 –

+2

沒有我知道,但我從來沒有密切尋找一個。一般而言,除了'[a-zA-Z0-9_]'以外的其他名稱不能與其他工具(包括Parquet)保持合理的兼容性。對於'VectorAssembler'來說,它並不重要。 – zero323