使用 Scala 将 org.apache.spark.mllib.linalg.Vector RDD 转换为 Spark 中的 DataFrame
Convert an org.apache.spark.mllib.linalg.Vector RDD to a DataFrame in Spark using Scala
我有一个 org.apache.spark.mllib.linalg.Vector RDD [Int Int Int] 。
我正在尝试使用此代码将其转换为数据框
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
vectrdd 属于 org.apache.spark.mllib.linalg.Vector
类型
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()
我遇到了这个错误
error: constructor cannot be instantiated to expected type;
found : (T1, T2, T3)
required: org.apache.spark.mllib.linalg.Vector
val df = vectrdd.map { case (t0, t1, t2) => RFM(p0, p1, p2) }.toDF()
我用这个例子作为指导>>
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]]
)
我有一个 org.apache.spark.mllib.linalg.Vector RDD [Int Int Int] 。 我正在尝试使用此代码将其转换为数据框
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
vectrdd 属于 org.apache.spark.mllib.linalg.Vector
类型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()
我遇到了这个错误
error: constructor cannot be instantiated to expected type;
found : (T1, T2, T3)
required: org.apache.spark.mllib.linalg.Vector
val df = vectrdd.map { case (t0, t1, t2) => RFM(p0, p1, p2) }.toDF()
我用这个例子作为指导>>
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]]
)