2017-02-15 4 views
0

У меня есть spark.ml DataFrame, который содержит много столбцов, каждый из этих столбцов содержит SparseVector в строке. Я хотел бы применить MultivariateStatisticalSummary.colStats к каждому колонку, и colStats подписи:Spark.ml DataFrame, содержащий SparseVector

def colStats(X: RDD[Vector]): MultivariateStatisticalSummary 

, который кажется идеальным ... за исключение того, что я не могу показаться, чтобы select столбца из этого DataFrame и заставить его быть RDD[Vector]. Вот моя попытка:

val df: DataFrame = data.select(shardId) 
val col = df.as[(org.apache.spark.mllib.linalg.Vector)].rdd 
val s: MultivariateStatisticalSummary = Statistics.colStats(col) 

который не компилировать с сообщением (в Scala):

Unable to find encoder for type stored in a Dataset. Primitive types (Int, String, etc) and Product types (case classes) are supported by importing sqlContext.implicits._ Support for serializing other types will be added in future releases. 
val col = df.as[(org.apache.spark.mllib.linalg.Vector)].rdd 

Я также попытался:

val df = data.select(shardId) 
val col: RDD[Vector] = df.map(x => x.asInstanceOf[org.apache.spark.mllib.linalg.Vector]) 
val s: MultivariateStatisticalSummary = Statistics.colStats(col) 

, который не может во время выполнения с ошибкой:

java.lang.ClassCastException: org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema cannot be cast to org.apache.spark.mllib.linalg.Vector 

Как скрыть г ap между DataFrame и colStats?

ответ

0

Я нашел ответ после того, как все:

val df = data.select(shardId) 
val col: RDD[Vector] = df.map { _.get(0).asInstanceOf[org.apache.spark.mllib.linalg.Vector] } 
val s: MultivariateStatisticalSummary = Statistics.colStats(col) 

Хитрость только извлечь первый элемент каждой строки перед заливкой его.

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