如何将 VertexRDD 转换为 DataFrame

Posted

技术标签:

【中文标题】如何将 VertexRDD 转换为 DataFrame【英文标题】:how to convert VertexRDD to DataFrame 【发布时间】:2015-12-31 10:53:11 【问题描述】:

我有一个 VertexRDD[DenseVector[Double]],我想将其转换为数据帧。我不明白如何将 DenseVector 中的值映射到数据框中的新列。

我正在尝试将架构指定为:

val schemaString = "id prop1 prop2 prop3 prop4 prop5 prop6 prop7"
val schema = StructType(schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))

我认为一个选项是将我的 VertexRDD(breeze.linalg.DenseVector 包含所有值的地方)转换为 RDD[Row],以便我最终可以创建如下数据框:

val myRDD = myvertexRDD.map(f => Row(f._1, f._2.toScalaVector().toSeq))
val mydataframe = SQLContext.createDataFrame(myRDD, schema)

但我得到了一个

// scala.MatchError: 20502 (of class java.lang.Long)

任何提示都非常受欢迎

【问题讨论】:

【参考方案1】:

一种处理方法:

import org.apache.spark.sql.Row
import org.apache.spark.sql.types.StructType, StructField, LongType, DoubleType

val rows = myvertexRDD.map
  case(id, v) => Row.fromSeq(id +: v.toArray)


val schema = StructType(
  StructField("id", LongType, false) +: 
  (1 to 7).map(i => StructField(s"prop$i", DoubleType, false)))

val df = sqlContext.createDataFrame(rows, schema)

注意事项:

声明的类型必须与实际类型匹配。您不能声明字符串并传递 long 或 double 行的结构必须与声明的结构相匹配。在您的情况下,您尝试使用 LongVector[Double] 创建行,但声明 8 列

【讨论】:

以上是关于如何将 VertexRDD 转换为 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

如何将编码器作为参数传递给数据帧的 as 方法

根据下图转换熊猫数据框

我在 pandas 中设置了我的数据类型,但是在转换为 pyspark 时,所有数据都转到了字符串

Spark GraphX实例

如何将 UTC 时间转换为本地时间

如何将UTC秒数转换为日期,100分,在线等