我收到错误提示没有类型的隐式参数:编码器 []" 在 Spark

Posted

技术标签:

【中文标题】我收到错误提示没有类型的隐式参数:编码器 []" 在 Spark【英文标题】:I am getting error saying No implicit argument of type:Encoder[ ]" in Spark 【发布时间】:2020-01-03 04:38:03 【问题描述】:

我收到一条错误消息,提示 No implicit argument of type:Encoder[Movies] 你能告诉我哪里出了问题,因为我是 spark 新手。

我正在尝试读取电影文件并将其转换为具有 1 个“ID”列和第二个“电影名称”列的数据集。

import org.apache.spark.sql.SparkSession

object Practice 
    def main(args: Array[String]): Unit = 
        val spark = SparkSession
          .builder()
          .appName("dataFrameExample")
          .master("local")
          .getOrCreate()

    **case class Movies( ID:String, name:String)**

        val ds1 = spark.read
         .format("text")
         .option("header", "true") //first line in file has headers
         .load("C:\\SparkScala\\SparkScalaStudy\\movies").as[Movies]

        ds1.printSchema()
    

【问题讨论】:

import Spark.implicits._ 按照文档建议在创建 SparkSession 之后立即进行。 【参考方案1】:

您需要将case class Movies移出main函数,并在ds1之前添加import spark.implicits._

【讨论】:

【参考方案2】:

您可以导入 sparksession.implicits 来解决问题,也可以在对象中编写自己的隐式,如下所示:

import org.apache.spark.sql.Encoder, Encoders

object CustomImplicits     
  implicit val movieEncoder: Encoder[Movies] = Encoders.product[Movies]

然后简单地在你的 main 方法中导入隐式:

import package.containinig.implicits.CustomImplicits._
import org.apache.spark.sql.SparkSession
object Practice 
    def main(args: Array[String]): Unit = 
        val spark = SparkSession
          .builder()
          .appName("dataFrameExample")
          .master("local")
          .getOrCreate()

        val ds1 = spark.read
         .format("text")
         .option("header", "true") //first line in file has headers
         .load("C:\\SparkScala\\SparkScalaStudy\\movies").as[Movies]

        ds1.printSchema()
    

使用编码器,您可以在数据集上强制执行架构,因为如果违反架构会引发适当的错误。

【讨论】:

以上是关于我收到错误提示没有类型的隐式参数:编码器 []" 在 Spark的主要内容,如果未能解决你的问题,请参考以下文章

Scala 类型参数化,Shapeless - 找不到参数 Generic 的隐式值

找不到存储在数据集中的类型的编码器。尽管提供了适当的隐式,但错误[重复]

从数据类型varbinary到日期SQL服务器的隐式转换

参数类型的隐式 ParameterBinderFactory[org.joda.time.LocalDateTime]

找不到参数映射器的隐式值

找不到参数的隐式值