我收到错误提示没有类型的隐式参数:编码器 []" 在 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 的隐式值
找不到存储在数据集中的类型的编码器。尽管提供了适当的隐式,但错误[重复]