2015-10-24 2 views
6

я попасть искры и у меня есть проблемы с Vectors импорта org.apache.spark.mllib.linalg {Векторы, вектор}Spark: Входной вектор

ввода моей программы представляет собой текстовый файл. с содержит вывод в РДУ (Vector): dataset.txt:

[-0.5069793074881704,-2.368342680619545,-3.401324690974588] 
[-0.7346396928543871,-2.3407983487917448,-2.793949129209909] 
[-0.9174226561793709,-0.8027635530022152,-1.701699021443242] 
[0.510736518683609,-2.7304268743276174,-2.418865539558031] 

Итак, что попытка сделать это:

val rdd = sc.textFile("/workingdirectory/dataset") 
val data = rdd.map(s => Vectors.dense(s.split(',').map(_.toDouble))) 

у меня есть ошибка, потому что он прочитал [0,510736 518683609 как номер. Существуют ли какие-либо формы для прямой загрузки вектора, хранящегося в текстовом файле, без выполнения второй строки? Как я могу удалить "[" на этапе карты? Я действительно новичок в искру, извините, если это очень очевидный вопрос.

ответ

1

Вот один из способов сделать это:

val rdd = sc.textFile("/workingdirectory/dataset") 
val data = rdd.map { 
    s => 
    val vect = s.replaceAll("\\[", "").replaceAll("\\]","").split(',').map(_.toDouble) 
    Vectors.dense(vect) 
} 

Я просто сломал карту в линию для удобочитаемости целей.

Примечание: Помните, что это простая обработка строк на каждой строке.

+0

Как насчет 'капли (1) .dropRight (1) .split ("") карта (. _ toDouble) или' Вэл р = «- [0-9] + (?:. \\ [0-9] +), «г;?. p.findAllIn (s) .map (_. toDouble) '? – zero323

+0

Вот почему я сказал в одном направлении! :) – eliasah

4

Учитывая вход простейшая вещь, которую вы можете сделать, это использовать Vectors.parse:

scala> import org.apache.spark.mllib.linalg.Vectors 
import org.apache.spark.mllib.linalg.Vectors 

scala> Vectors.parse("[-0.50,-2.36,-3.40]") 
res14: org.apache.spark.mllib.linalg.Vector = [-0.5,-2.36,-3.4] 

Он также работает с редкими репрезентации:

scala> Vectors.parse("(10,[1,5],[0.5,-1.0])") 
res15: org.apache.spark.mllib.linalg.Vector = (10,[1,5],[0.5,-1.0]) 

Комбинируя его с вашими данными все, что вам нужно:

rdd.map(Vectors.parse) 

Если вы ожидаете, что неправильные/пустые строки вы можете его обернуть ING Try:.?

import scala.util.Try 

rdd.map(line => Try(Vectors.parse(line))).filter(_.isSuccess).map(_.get) 
+1

Я даже не знал, что существует метод! благодаря – eliasah