2016-05-10 4 views
1

у меня есть искра dataframe, которая имеет вектор в нем:Спарк Scala: Vector Dataframe для РДУ значений

org.apache.spark.sql.DataFrame = [sF: vector] 

, и я стараюсь, чтобы преобразовать его в РДУ значений:

org.apache.spark.rdd.RDD[(Double, Double)] 

Однако я не смог его правильно преобразовать. Я пробовал:

val m2 = m1.select($"sF").rdd.map{case Row(v1, v2) => (v1.toString.toDouble, v2.toString.toDouble)} 

и компилируется, но я получаю сообщение об ошибке выполнения:

scala.MatchError: [[-0.1111111111111111,-0.2222222222222222]] (of class org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema) 

когда я делаю:

m2.take(10).foreach(println). 

Есть ли что-то я делаю не так?

ответ

3

Предполагая, что вы хотите, первые два значения векторов, присутствующих в sF колонке, может быть, это будет работать:

import org.apache.spark.mllib.linalg.Vector 
val m2 = m1 
    .select($"sF") 
    .map { case Row(v: Vector) => (v(0), v(1)) } 

Вы получаете ошибку, потому что, когда вы делаете case Row(v1, v2), это не соответствует содержимому строки в вашем DataFrame, потому что вы ожидаете двух значений в каждой строке (v1 и v2), но есть только одно: Вектор.

Примечание: вам не нужно звонить .rdd, если вы собираетесь выполнить операцию .map.

+0

Спасибо за помощь. Я получаю сообщение об ошибке: Any не принимает параметры при вызове v (2). Любые идеи почему? – mt88

+0

Является ли ваш код в точности равным моему? Или вы опускаете 'v: Vector'? Должен быть явный тип «Вектор». Кроме того, не забывайте об импорте. –

+0

Нет, я вхожу в v: Vector part – mt88

Смежные вопросы