0

У меня есть DataFrame с столбцом с именем KFA, содержащий строку с угловыми скобками на обоих концах. В этой длинной строке есть 4 двойных значения. Я хотел бы преобразовать это в DataFrame с векторами.Как преобразовать DataFrame со строкой в ​​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 [Double]' из объекта Row –

ответ

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