【问题标题】:value toDS is not a member of org.apache.spark.rdd.RDD值 toDS 不是 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

【问题讨论】:

    标签: scala hadoop apache-spark dataset rdd


    【解决方案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)。
      猜你喜欢
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 2016-05-20
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      相关资源
      最近更新 更多