值 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._ 因为toDStoDF 是在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 的成员的主要内容,如果未能解决你的问题,请参考以下文章

spark.implicits._ 导入了啥?

Spark2.1.0单机模式无法启动master的问题

toDS() 如何注入到 Seq 对象中[重复]

这些坐标系的中文名称是啥?

使用 Pyspark / Dataframes 时,如何将谓词下推到 Cassandra 或限制请求的数据?

Windows Server 2016 DNS Policy Tod-Intelligent 2