在Spark和Scala中创建数据集时出现问题

在Spark和Scala中创建数据集时出现问题,scala,apache-spark,Scala,Apache Spark,我在使用spark数据集时遇到问题! 当我想使用case类时,我经常会遇到关于编码器的异常 代码如下所示: case class OrderDataType (orderId: String, customerId: String, orderDate: String) import spark.implicits._ val ds = spark.read.option("header", "true").csv("data\\orders.csv").as[OrderDataType]

我在使用spark数据集时遇到问题! 当我想使用case类时,我经常会遇到关于编码器的异常 代码如下所示:

case class OrderDataType (orderId: String, customerId: String, orderDate: String)
import spark.implicits._

val ds = spark.read.option("header", "true").csv("data\\orders.csv").as[OrderDataType]
我在编译期间遇到此异常:

找不到OrderDataType类型的编码器。需要隐式编码器[OrderDataType]在数据集中存储OrderDataType实例。导入spark.implicits支持基元类型(Int、String等)和产品类型(case类)。在将来的版本中将添加对序列化其他类型的支持

我已经添加了以下内容:导入spark.implicits.\u但它不能解决问题

根据spark和scala文档,编码必须使用scala隐式完成


这段代码有什么问题,我应该怎么做才能修复它

main
方法之外定义您的案例类,然后在main方法中读取csv文件并转换为
数据集

示例:

case class OrderDataType (orderId: String, customerId: String, orderDate: String)
  def main(args: Array[String]): Unit = {
val ds = spark.read.option("header", "true").csv("data\\orders.csv").as[OrderDataType]
}

//or

def main(args: Array[String]): Unit = {
    val ds = spark.read.option("header", "true").csv("data\\orders.csv").as[(String,String,String)]
    }

main
方法的外部定义您的案例类,然后在main方法中读取csv文件并转换为
数据集

示例:

case class OrderDataType (orderId: String, customerId: String, orderDate: String)
  def main(args: Array[String]): Unit = {
val ds = spark.read.option("header", "true").csv("data\\orders.csv").as[OrderDataType]
}

//or

def main(args: Array[String]): Unit = {
    val ds = spark.read.option("header", "true").csv("data\\orders.csv").as[(String,String,String)]
    }

另一种方式是。。。您可以使用应用程序
中的所有内容(足够智能,可以从def main的外侧识别案例类)

mydata/Orders.csv

orderId,customerId,orderDate
1,2,21/08/1977
1,2,21/08/1978
示例代码:

package examples

import org.apache.log4j.Level
import org.apache.spark.sql._

object Orders extends App {
  val logger = org.apache.log4j.Logger.getLogger("org")
  logger.setLevel(Level.WARN)


  val spark = SparkSession.builder.appName(getClass.getName)
    .master("local[*]").getOrCreate


  case class OrderDataType(orderId: String, customerId: String, orderDate: String)

  import spark.implicits._

  val ds1 = spark.read.option("header", "true").csv("mydata/Orders.csv").as[OrderDataType]
  ds1.show
}

结果:

+-------+----------+----------+
|orderId|customerId| orderDate|
+-------+----------+----------+
|      1|         2|21/08/1977|
|      1|         2|21/08/1978|
+-------+----------+----------+
为什么案例类在def main之外


另一种方法是。。。您可以使用应用程序
中的所有内容(足够智能,可以从def main的外侧识别案例类)

mydata/Orders.csv

orderId,customerId,orderDate
1,2,21/08/1977
1,2,21/08/1978
示例代码:

package examples

import org.apache.log4j.Level
import org.apache.spark.sql._

object Orders extends App {
  val logger = org.apache.log4j.Logger.getLogger("org")
  logger.setLevel(Level.WARN)


  val spark = SparkSession.builder.appName(getClass.getName)
    .master("local[*]").getOrCreate


  case class OrderDataType(orderId: String, customerId: String, orderDate: String)

  import spark.implicits._

  val ds1 = spark.read.option("header", "true").csv("mydata/Orders.csv").as[OrderDataType]
  ds1.show
}

结果:

+-------+----------+----------+
|orderId|customerId| orderDate|
+-------+----------+----------+
|      1|         2|21/08/1977|
|      1|         2|21/08/1978|
+-------+----------+----------+
为什么案例类在def main之外


谢谢,为什么我不能在方法中使用case类?我面对这个问题,但并不完全理解。下面是一些有用的链接。。谢谢,为什么我不能在一个方法中使用case类呢?我面对这个问题,但并不完全理解。这里有一些有用的链接。。