我正在测试一些基本的火花代码,其中我通过从数据源读取将数据帧转换为数据集。
import org.apache.spark.sql.SparkSession
object RunnerTest {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder.appName("SparkSessionExample")
.master("local[4]")
.config("spark.sql.warehouse.dir", "target/spark-warehouse")
.getOrCreate
case class Characters(name: String, id: Int)
import spark.implicits._
val path = "examples/src/main/resources/Characters.csv"
val peopleDS = spark.read.csv(path).as[Characters]
}
}
这是太简单的代码,但我却收到编译错误,
错误:(42,43)找不到字符类型的编码器。隐式 需要Encoder [Characters]将Characters实例存储在 数据集。基本类型(整数,字符串等)和产品类型(大小写) 类)通过导入spark.implicits._来支持 序列化其他类型将在以后的版本中添加。 val peopleDS = spark.read.csv(path).as [字符]
虽然我使用的是Spark 2.4和sbr 2.12.8。
答案 0 :(得分:1)
实际上,这里的问题是case class
在主object
内部。由于某种原因,spark不喜欢它。这是一个愚蠢的错误,但花了一段时间才弄清楚丢失了什么。一旦将case class
从object
中移出,它就可以正常编译了。
import org.apache.spark.sql.SparkSession
case class Characters(name: String, id: Int)
object RunnerTest {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder.appName("SparkSessionExample")
.master("local[4]")
.config("spark.sql.warehouse.dir", "target/spark-warehouse")
.getOrCreate
import spark.implicits._
val path = "examples/src/main/resources/Characters.csv"
val peopleDS = spark.read.csv(path).as[Characters]
}
}