相关疑难解决方法(0)

如何在Dataset中存储自定义对象?

根据Spark数据集介绍:

正如我们期待着星火2.0,我们计划将数据集的一些令人兴奋的改进,具体包括:...自定义编码器 - 而我们对各种各样的类型目前自动生成编码器,我们想开了一个API,用于自定义对象.

并尝试将自定义类型存储为Dataset导致以下错误:

无法找到存储在数据集中的类型的编码器.导入sqlContext.implicits._支持原始类型(Int,String等)和产品类型(case类).将来版本中将添加对序列化其他类型的支持

要么:

Java.lang.UnsupportedOperationException:找不到针对....的编码器

有没有现成的解决方法?


请注意,此问题仅作为社区Wiki答案的入口点存在.随意更新/改进问题和答案.

scala apache-spark apache-spark-dataset apache-spark-encoders

133
推荐指数
4
解决办法
6万
查看次数

在scala中导入spark.implicits._

我正在尝试导入spark.implicits._显然,这是scala中类中的一个对象.当我用这样的方法导入它时:

def f() = {
  val spark = SparkSession()....
  import spark.implicits._
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我正在编写一个测试类,我想让这个导入可用于我尝试过的所有测试:

class SomeSpec extends FlatSpec with BeforeAndAfter {
  var spark:SparkSession = _

  //This won't compile
  import spark.implicits._

  before {
    spark = SparkSession()....
    //This won't either
    import spark.implicits._
  }

  "a test" should "run" in {
    //Even this won't compile (although it already looks bad here)
    import spark.implicits._

    //This was the only way i could make it work
    val spark = this.spark
    import spark.implicits._
  }
}
Run Code Online (Sandbox Code Playgroud)

这不仅看起来很糟糕,我不想为每次测试都做到这一点."正确"的做法是什么?

scala apache-spark

44
推荐指数
3
解决办法
3万
查看次数

尝试将数据帧行映射到更新行时出现编码器错误

当我试图在我的代码中做同样的事情,如下所述

dataframe.map(row => {
  val row1 = row.getAs[String](1)
  val make = if (row1.toLowerCase == "tesla") "S" else row1
  Row(row(0),make,row(2))
})
Run Code Online (Sandbox Code Playgroud)

我从这里采取了上述参考: Scala:如何使用scala替换Dataframs中的值 但是我收到编码器错误

无法找到存储在数据集中的类型的编码器.导入spark.im plicits支持原始类型(Int,S tring等)和产品类型(case类)._将在以后的版本中添加对序列化其他类型的支持.

注意:我正在使用spark 2.0!

scala apache-spark apache-spark-sql apache-spark-dataset apache-spark-encoders

33
推荐指数
2
解决办法
3万
查看次数

使用案例类编码JSON时,为什么错误"无法找到存储在数据集中的类型的编码器"?

我写过火花工作:

object SimpleApp {
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("Simple Application").setMaster("local")
    val sc = new SparkContext(conf)
    val ctx = new org.apache.spark.sql.SQLContext(sc)
    import ctx.implicits._

    case class Person(age: Long, city: String, id: String, lname: String, name: String, sex: String)
    case class Person2(name: String, age: Long, city: String)

    val persons = ctx.read.json("/tmp/persons.json").as[Person]
    persons.printSchema()
  }
}
Run Code Online (Sandbox Code Playgroud)

在IDE中运行main函数时,发生2错误:

Error:(15, 67) Unable to find encoder for type stored in a Dataset.  Primitive types (Int, String, etc) and Product types (case classes) are supported …
Run Code Online (Sandbox Code Playgroud)

scala apache-spark apache-spark-dataset apache-spark-encoders

15
推荐指数
1
解决办法
2万
查看次数

如何使用在Scala中创建数据集的通用案例类实现特征

我想创建一个应该与案例类T一起实现的Scala特征。该特征只是加载数据并将其转换为类型T的Spark数据集。我得到一个错误,即无法存储任何编码器,我认为这是因为Scala不知道T应该是案例类。我怎样才能告诉编译器呢?我见过某个地方应该提到Product,但是还没有定义此类。.随意建议其他方法!

我有以下代码,但未编译该错误:42:错误:找不到用于存储在数据集中的类型的编码器。通过导入sqlContext.implicits._ [INFO] .as [T],支持基本类型(Int,String等)和产品类型(案例类)。

我正在使用Spark 1.6.1

码:

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.{Dataset, SQLContext}    

/**
      * A trait that moves data on Hadoop with Spark based on the location and the granularity of the data.
      */
    trait Agent[T] {
      /**
        * Load a Dataframe from the location and convert into a Dataset
        * @return Dataset[T]
        */
      protected def load(): Dataset[T] = {
        // Read in the data
        SparkContextKeeper.sqlContext.read
          .format("com.databricks.spark.csv")
          .load("/myfolder/" + location + "/2016/10/01/")
          .as[T]
      }
    }
Run Code Online (Sandbox Code Playgroud)

generics scala traits case-class apache-spark-sql

2
推荐指数
1
解决办法
1748
查看次数