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:映射操作失败/没有找到任何可映射的值

捕获Scala进程失败

ftp上传文件失败,长传文件大小为零字节!

ADF 映射数据流失败并出现 BatchUpdateException

云功能失败并出现异常:内部,Flutter 应用程序中没有代码

在管道中发布 NET 6 应用程序失败并出现“找不到类型”异常