加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用Scala将org.apache.spark.mllib.linalg.Vector RDD转换为Spa

发布时间:2020-12-16 10:00:28 所属栏目:安全 来源:网络整理
导读:我有一个[Int Int Int]的org.apache.spark.mllib.linalg.Vector RDD. 我试图使用此代码将其转换为数据帧 import sqlContext.implicits._import org.apache.spark.sql.types.StructTypeimport org.apache.spark.sql.types.StructFieldimport org.apache.spark
我有一个[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,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,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,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,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,p2) }.toDF()

我用这个例子作为指南>>
Convert RDD to Dataframe in Spark/Scala

解决方法

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

此外,您不应该执行val vectarr = vectrdd.toArray() – 这会将RDD转换为Array,然后对toDF的最终调用将不起作用,因为toDF仅适用于RDD.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读