值 toDS 不是 org.apache.spark.rdd.RDD 的成员
Posted
技术标签:
【中文标题】值 toDS 不是 org.apache.spark.rdd.RDD 的成员【英文标题】:value toDS is not a member of org.apache.spark.rdd.RDD 【发布时间】:2017-11-19 12:28:11 【问题描述】:我正在尝试编写将 RDD 转换为数据集的示例 Apache Spark 程序。但在这个过程中,我得到了编译时错误。
这是我的示例代码和错误:
代码:
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.SparkContext
import org.apache.spark.sql.Dataset
object Hello
case class Person(name: String, age: Int)
def main(args: Array[String])
val conf = new SparkConf()
.setAppName("first example")
.setMaster("local")
val sc = new SparkContext(conf)
val peopleRDD: RDD[Person] = sc.parallelize(Seq(Person("John", 27)))
val people = peopleRDD.toDS
我的错误是:
value toDS is not a member of org.apache.spark.rdd.RDD[Person]
我添加了 Spark 核心和 Spark SQL jar。
我的版本是:
火花 1.6.2
斯卡拉 2.10
【问题讨论】:
【参考方案1】:我可以在您的代码中看到两个错误。
首先你必须import sqlContext.implicits._
因为toDS
和toDF
是在sqlContext 的隐式中定义的。
其次,case class
应在使用案例类的类范围之外定义,否则将出现task not serializable exception
完整的解决方案如下
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.SparkContext
import org.apache.spark.sql.Dataset
object Hello
def main(args: Array[String])
val conf = new SparkConf()
.setAppName("first example")
.setMaster("local")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._
val peopleRDD: RDD[Person] = sc.parallelize(Seq(Person("John", 27)))
val people = peopleRDD.toDS
people.show(false)
case class Person(name: String, age: Int)
【讨论】:
在这种情况下,在范围内定义案例类可能是一个非常烦人的问题。感谢您的提示!import spark.implicits._
对我来说失败了,直到我将案例类移到对象之外。谢谢!【参考方案2】:
Spark 版本
toDS
可用于sqlContext.implicits._
val sqlContext = new SQLContext(sc);
import sqlContext.implicits._
val people = peopleRDD.toDS()
Spark 版本 >= 2.x
val spark: SparkSession = SparkSession.builder
.config(conf)
.getOrCreate;
import spark.implicits._
val people = peopleRDD.toDS()
嗨
【讨论】:
【参考方案3】:确切的答案是你同时导入,
导入 spark.implicit._
导入 sqlContext.implicit._ 这导致了问题,删除其中任何一个,你不会遇到这样的问题
【讨论】:
嗨,乔杜。为清楚起见,请将代码包装在代码块中 (see documentation)。以上是关于值 toDS 不是 org.apache.spark.rdd.RDD 的成员的主要内容,如果未能解决你的问题,请参考以下文章