Scala 数据集映射失败并出现异常没有为零实际参数找到适用的构造函数/方法
Posted
技术标签:
【中文标题】Scala 数据集映射失败并出现异常没有为零实际参数找到适用的构造函数/方法【英文标题】:Scala dataset map fails with exception No applicable constructor/method found for zero actual parameters 【发布时间】:2020-04-16 18:56:30 【问题描述】:我有以下案例类
case class FeedbackData (prefix : String, position : Int, click : Boolean,
suggestion: Suggestion,
history : List[RequestHistory],
eventTimestamp: Long)
case class Suggestion (clicks : Long, sources : List[String], ctr : Float)
case class RequestHistory (timestamp: Long, url: String)
我用它对我的数据集执行地图操作
sqlContext = ss.sqlContext
import sqlContext.implicits._
val input: Dataset[FeedbackData] = ss.read.json("filename").as(Encoders.bean(classOf[FeedbackData]))
input.map(row => transformRow(row))
在运行时我看到异常
java.util.concurrent.ExecutionException: org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 24, Column 81: failed to compile:
No applicable constructor/method found for zero actual parameters; candidates are: "package.FeedbackData(java.lang.String, int, boolean, package.Suggestion, scala.collection.immutable.List, long)"
我做错了什么?
【问题讨论】:
【参考方案1】:这里的上下文很好,case 类的问题,必须使用 Scala long (Long) 而不是 Java long (long):
case class A(num1 : Long, num2 : Long, num3 : Long)
【讨论】:
实际上是在使用 Scala Long 本身。已使用实际数据结构编辑了问题。还确认问题不在于测试设置,因此可能与数据结构有关,但不确定是什么问题 如果使用“input.show(false)”这样的行代替“input.map(..”,一切正常吗?也可以使用这种构造将DataFrame转换为DataSet:“.json ("文件名").as[FeedbackData]" 是的。更改为 .as[FeedbackData] 使其正常工作。这里的理论区别是什么? 也可以像上面那样处理嵌套数据结构,使用映射函数是唯一的面向对象方式对吗?通过 UDF,实际的建议和历史属性在行对象中展开,因此对它们进行操作需要使用不是很干净的 getByIndex。 Map Functions 由于反序列化成本而有巨大的性能损失,但在这里看不到出路 ".as[FeedbackData]" 是官方创建DataSets的方式,这里详述:spark.apache.org/docs/latest/…以上是关于Scala 数据集映射失败并出现异常没有为零实际参数找到适用的构造函数/方法的主要内容,如果未能解决你的问题,请参考以下文章
RestKit & Cocoapods:映射操作失败/没有找到任何可映射的值
ADF 映射数据流失败并出现 BatchUpdateException