【发布时间】:2017-07-17 17:57:32
【问题描述】:
错误:(39, 12) 无法找到存储在数据集中的类型的编码器。通过导入 spark.implicits 支持原始类型(Int、String 等)和产品类型(案例类)。未来版本中将添加对序列化其他类型的支持。
dbo.map((r) => ods.map((s) => {
错误:(39、12)方法映射的参数不足:(隐含证据$6:org.apache.spark.sql.Encoder[org.apache.spark.sql.Dataset[Int]])org.apache.spark.sql .Dataset[org.apache.spark.sql.Dataset[Int]]。
未指定值参数证据$6。
dbo.map((r) => ods.map((s) => {
object Main extends App {
....
def compare(sqlContext: org.apache.spark.sql.SQLContext,
dbo: Dataset[Cols], ods: Dataset[Cols]) = {
import sqlContext.implicits._ // Tried import dbo.sparkSession.implicits._ too
dbo.map((r) => ods.map((s) => { // Errors occur here
0
}))
}
case class Cols (A: Int,
B: String,
C: String,
D: String,
E: Double,
F: Date,
G: String,
H: String,
I: Double,
J: String
)
- 为什么我导入
sqlContext.implicits._后还是报错? - 我创建了参数
sqlContext仅用于导入。有没有更好的方法不传递参数?这应该由
import dbo.sparkSession.implicits._解决
【问题讨论】:
-
我试过
import dbo.sparkSession.implicits._还是出现同样的错误? -
再看一遍我想我明白了问题所在,错误消息说应该是
spark.implicits._来导入编码器。另一个问题是您试图访问地图中的另一个数据集,这是不可能的。您将需要以某种方式组合您的数据集(通常使用连接) -
基本上,我需要为两个数据集的所有组合中的每一个获取一个值,并获得大于阈值的值。所以我需要连接两个数据集,然后对连接的数据集运行计算。对?计算是否会分发给所有执行者?
-
是的,您需要加入,然后对结果数据集进行计算。因为您想要所有可能的组合,这将是一个笛卡尔。请注意,这将非常慢,因为会生成许多记录(如果您真的想将所有内容与所有内容匹配,这是不可避免的,如果您只需要一个数据集中的数据进行阈值过滤,我会在加入之前进行过滤)。
-
是的,我需要对笛卡尔结果进行计算,只返回满足某些条件的结果。这就是我将 SQL 服务器代码转换为 Spark 的原因,以便计算可以分发给许多执行程序(并在内存中执行)以加快计算速度。
标签: scala apache-spark