使用Scala将org.apache.spark.mllib.linalg.Vector RDD转换为Spark中的DataFrame

时间:2016-01-09 00:19:27

标签: scala apache-spark rdd

我有一个[Int Int Int]的org.apache.spark.mllib.linalg.Vector RDD。 我正在尝试使用此代码将其转换为数据框

^

vectrdd属于org.apache.spark.mllib.linalg.Vector类型

import sqlContext.implicits._
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StructField
import org.apache.spark.sql.types.DataTypes
import org.apache.spark.sql.types.ArrayData

我收到以下错误

val vectarr = vectrdd.toArray()
case class RFM(Recency: Integer, Frequency: Integer, Monetary: Integer)
val df = vectarr.map { case Array(p0, p1, p2) => RFM(p0, p1, p2) }.toDF()

我试过的第二种方法就是这个

warning: fruitless type test: a value of type         
org.apache.spark.mllib.linalg.Vector cannot also be a Array[T]
val df = vectarr.map { case Array(p0, p1, p2) => RFM(p0, p1, p2) }.toDF()

error: pattern type is incompatible with expected type;
found   : Array[T]
required: org.apache.spark.mllib.linalg.Vector
val df = vectarr.map { case Array(p0, p1, p2) => RFM(p0, p1, p2) }.toDF()

我收到了这个错误

val vectarr=vectrdd.toArray().take(2)
case class RFM(Recency: String, Frequency: String, Monetary: String)
val df = vectrdd.map { case (t0, t1, t2) => RFM(p0, p1, p2) }.toDF()

我使用此示例作为指南>> Convert RDD to Dataframe in Spark/Scala

1 个答案:

答案 0 :(得分:3)

vectarr的类型为Array[org.apache.spark.mllib.linalg.Vector],因此在模式匹配中,您无法匹配Array(p0, p1, p2),因为匹配的是Vector,而不是Array。

此外,您不应该val vectarr = vectrdd.toArray() - 这会将RDD转换为数组,然后最终调用toDF将无效,因为toDF仅适用于RDD'秒。

正确的行是(假设您将RFM更改为双打)

val df = vectrdd.map(_.toArray).map { case Array(p0, p1, p2) => RFM(p0, p1, p2)}.toDF()

或等效地将val vectarr = vectrdd.toArray()(生成Array[Vector])替换为val arrayRDD = vectrdd.map(_.toArray())(生成RDD[Array[Double]]