如何从 RDD 创建 Spark 数据集

Posted

技术标签:

【中文标题】如何从 RDD 创建 Spark 数据集【英文标题】:How to create a Spark Dataset from an RDD 【发布时间】:2016-09-27 13:48:30 【问题描述】:

我有一个RDD[LabeledPoint],打算在机器学习管道中使用。我们如何将RDD 转换为DataSet?注意较新的spark.ml api 需要Dataset 格式的输入。

【问题讨论】:

【参考方案1】:

这是一个遍历额外步骤的答案 - DataFrame。我们使用SQLContext 创建DataFrame,然后使用所需的对象类型创建DataSet - 在本例中为LabeledPoint

val sqlContext = new SQLContext(sc)
val pointsTrainDf =  sqlContext.createDataFrame(training)
val pointsTrainDs = pointsTrainDf.as[LabeledPoint]

更新听说过SparkSession吗? (直到现在我都没有..)

因此,SparkSession 显然是 Spark 2.0.0 中的首选方式 (TM) 并且正在向前发展。这是新的(火花)世界秩序的更新代码:

Spark 2.0.0+ 方法

请注意,与SQLContext 方法相比,在以下两种方法(其中一种更简单,其中一种归功于@zero323)中,我们已经实现了重要的节省:不再需要首先创建DataFrame

val sparkSession =  SparkSession.builder().getOrCreate()
val pointsTrainDf =  sparkSession.createDataset(training)
val model = new LogisticRegression()
   .train(pointsTrainDs.as[LabeledPoint])

Spark 2.0.0+ 的第二种方式感谢@zero323

val spark: org.apache.spark.sql.SparkSession = ???
import spark.implicits._

val trainDs = training.toDS()

传统 Spark 1.X 和更早的方法

val sqlContext = new SQLContext(sc)  // Note this is *deprecated* in 2.0.0
import sqlContext.implicits._
val training = splits(0).cache()
val test = splits(1)
val trainDs = training**.toDS()**

另请参阅:How to store custom objects in Dataset? 尊敬的@zero323。

【讨论】:

training.toDS 怎么样? @zero323 啊,我知道我需要import sqlContext._。更新答案。 @zero323 您已经添加了足够的信息 - 请随意添加您自己的答案 @zero323 所以你注意到了一周前的评论。我担心你把它看得太认真了;)。这是为了尊重你的知识。你也有很好的方法/态度。 我好吗?你一定把我误认为是我的好双胞胎了 :) BTW:在这里链接***.com/q/36648128/1560062 可能是个好主意。

以上是关于如何从 RDD 创建 Spark 数据集的主要内容,如果未能解决你的问题,请参考以下文章

Spark 核心数据结构:弹性分布式数据集 RDD

使用 Scala 在 Apache Spark 中连接不同 RDD 的数据集

spark RDD(弹性分布式数据集)可以更新吗?

Spark RDD 分布式弹性数据集

Spark RDD理解

[Spark]-RDD