0

我有一個DataFrame,其列名爲KFA包含一個兩端都帶有尖括號的字符串。有在這一長串的4個值。我想這個轉換成具有矢量數據幀。如何將帶有字符串的DataFrame轉換爲帶有Scala(Spark 2.0)中的向量的DataFrame

這是數據框的第一個元素:

> dataFrame1.first() 
res130: org.apache.spark.sql.Row = [[.00663 .00197 .29809 .0034]] 

你能幫我,轉變爲具有4個雙值的密集向量。

我已經試過此命令

dataFrame1.select("KFA") 
    .map((x=>x.mkString("").replace("]","").replace("[","").split(" "))) 
    .rdd.map(x=>Vectors.dense(x(0).toDouble,x(1).toDouble,x(2).toDouble,x(3).toDouble,x(4).toDouble)) 

這看起來很笨拙且無法讀取。你可以建議這樣做的任何其他方式?

+1

有什麼'mkString'的目的,如果你只是要拆呢? –

+0

@ cricket_007使用'mkString'因爲我不能用'.replace(「]」,「」)'在spark.sql.Row –

+0

你並不需要創建一個字符串,我不認爲。你可以從'一排的對象getAs [雙]' –

回答

1

下面是正則表達式的選項:

import org.apache.spark.mllib.linalg.{Vector, Vectors} 

val p = "[.0-9]+".r 
val rddVec = dataFrame1.select("KFA") 
      .map(x => Vectors.dense(p.findAllIn(x(0).toString).map(_.toDouble).toArray)) 

# rddVec: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] = MapPartitionsRDD[49] at map at <console>:39 

rddVec.collect 
# res43: Array[org.apache.spark.mllib.linalg.Vector] = 
     Array([0.00663,0.00197,0.29809,0.0034], [0.00663,0.00197,0.29809,0.0034]) 
相關問題