[英]Problem creating dataset in Spark and Scala
我在使用 spark 数据集时遇到了一个问题:当我想用例 class 时,我不断收到关于编码器的异常,代码如下所示:
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 类型的编码器。 需要隐式 Encoder[OrderDataType] 将 OrderDataType 实例存储在数据集中。 通过导入 spark.implicits 支持原始类型(Int、String 等)和产品类型(案例类)。未来版本中将添加对序列化其他类型的支持。
我已经添加了这个: import spark.implicits._但它并没有解决问题!
根据 spark 和 scala 文档,编码必须使用 scala 隐式完成!
这段代码有什么问题,我应该怎么做才能修复它!
其他方式是...您可以使用object Orders extends App
(足够智能,可以从 def main 外部识别案例 class)
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|
+-------+----------+----------+
为什么将 class 放在 def main....
在main
方法之外定义您的案例 class 然后在 main 方法中读取 csv 文件并转换为dataset
。
Example:
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)]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.