【问题标题】:Convert an org.apache.spark.mllib.linalg.Vector RDD to a DataFrame in Spark using Scala使用 Scala 将 org.apache.spark.mllib.linalg.Vector RDD 转换为 Spark 中的 DataFrame
【发布时间】:2016-04-13 19:08:44
【问题描述】:

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

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()

我以这个例子为指导>> Convert RDD to Dataframe in Spark/Scala

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案1】:

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

    另外,您不应该这样做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]]

    【讨论】:

      猜你喜欢
      • 2018-03-05
      • 1970-01-01
      • 2017-06-13
      • 2016-01-07
      • 2020-08-08
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多