【发布时间】:2017-07-17 16:46:51
【问题描述】:
以下代码在最后一个map(...) 上出现了两个错误。 map() 函数中缺少什么参数?如何解决“编码器”的错误?
错误:
错误:(60, 11) 无法找到存储在数据集中的类型的编码器。通过导入 spark.implicits 支持原始类型(Int、String 等)和产品类型(案例类)。未来版本中将添加对序列化其他类型的支持。 .map(r => Cols(r.getInt(0), r.getString(1), r.getString(2), r.getString(3), r.getDouble(4), r.getDate(5), r.getString(6), r.getString(7), r.getDouble(8), r.getString(9))) 错误:(60, 11) 方法映射的参数不足:(隐式证据 $6: org.apache.spark.sql.Encoder[Cols])org.apache.spark.sql.Dataset[Cols]。 未指定值参数证据$6。 .map(r => Cols(r.getInt(0), r.getString(1), r.getString(2), r.getString(3), r.getDouble(4), r.getDate(5), r.getString(6), r.getString(7), r.getDouble(8), r.getString(9)))代码:
case class Cols (A: Int,
B: String,
C: String,
D: String,
E: Double,
F: Date,
G: String,
H: String,
I: Double,
J: String
)
class SqlData(sqlContext: org.apache.spark.sql.SQLContext, jdbcSqlConn: String) {
def getAll(source: String) = {
sqlContext.read.format("jdbc").options(Map(
"driver" -> "com.microsoft.sqlserver.jdbc.SQLServerDriver",
"url" -> jdbcSqlConn,
"dbtable" -> s"MyFunction('$source')"
)).load()
.select("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
// The following line(60) got the errors.
.map((r) => Cols(r.getInt(0), r.getString(1), r.getString(2), r.getString(3), r.getDouble(4), r.getDate(5), r.getString(6), r.getString(7), r.getDouble(8), r.getString(9)))
}
}
更新:
我有以下功能
def compare(sqlContext: org.apache.spark.sql.SQLContext, dbo: Dataset[Cols], ods: Dataset[Cols]) = {
import sqlContext.implicits._
dbo.map((r) => ods.map((s) => { // Errors occur here
0
}))
它得到了同样的错误。
- 为什么我导入
sqlContext.implicits._后还是报错? - 我创建了一个新参数
sqlContext只是为了导入。有没有更好的方法?
【问题讨论】:
-
为什么不
select.as[Cols]? -
您是否按照错误提示
import spark.implicits._?而且,缺少的参数是隐式编码器,所以它是同一个问题,解决一个,你已经解决了另一个。 -
@TzachZohar 当我将
import org.apache.spark.implicits._放在顶部时出现cannot resolve symbol implicits.的错误? -
@T.Gawęda
as[Cols]在.as[Cols]上遇到了同样的错误。 -
你应该有一个 SparkSession 的实例,它通常命名为
spark,这就是你导入的内容。您还可以通过SQLContext实例使用import sqlContext.implicits._
标签: scala apache-spark