在Scala中使用RDD操作转换错误

时间:2017-03-14 07:59:35

标签: scala apache-spark

我是Scala的新手,在做一些练习时遇到了错误。

我尝试将RDD转换为DataFrame,以下是我的代码。

package com.sclee.examples

import com.sun.org.apache.xalan.internal.xsltc.compiler.util.IntType
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.Row
import org.apache.spark.sql.types.{LongType, StringType, StructField, StructType};


object App {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("examples").setMaster("local")
    val sc = new SparkContext(conf)

    val sqlContext = new org.apache.spark.sql.SQLContext(sc)
    import sqlContext.implicits._

    case class Person(name: String, age: Long)

    val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
    val df = personRDD.map({
      case Row(val1: String, val2: Long) => Person(val1,val2)
    }).toDS()

//    val ds = personRDD.toDS()
  }
}

我按照Spark文档中的说明进行操作,并引用了一些博客,向我展示了如何将rdd转换为数据帧,但我得到了以下错误。

Error:(20, 27) Unable to find encoder for type stored in a Dataset.  Primitive types (Int, String, etc) and Product types (case classes) are supported by importing sqlContext.implicits._  Support for serializing other types will be added in future releases.
    val df = personRDD.map({

虽然我试图自己解决问题,但失败了。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

以下代码有效:

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession

case class Person(name: String, age: Long)
object SparkTest {
  def main(args: Array[String]): Unit = {

    // use the SparkSession of Spark 2
    val spark = SparkSession
      .builder()
      .appName("Spark SQL basic example")
      .config("spark.some.config.option", "some-value")
      .getOrCreate()

    import spark.implicits._

    // this your RDD - just a sample how to create an RDD
    val personRDD: RDD[Person] = spark.sparkContext.parallelize(Seq(Person("A",10),Person("B",20)))

   // the sparksession has a method to convert to an Dataset
   val ds = spark.createDataset(personRDD)
   println(ds.count())
  }
}

我做了以下更改:

  • 使用SparkSession代替SparkContextSqlContext
  • Person课程移出应用程序(我不知道为什么要这样做 此)
  • 使用createDataset进行转化

但是,我想这种转换非常罕见,您可能希望使用read方法直接将您的输入读入Dataset