java.lang.NoSuchMethodException: <Class>.<init>(java.lang.String) 复制自定义 Transformer 时
java.lang.NoSuchMethodException: <Class>.<init>(java.lang.String) when copying custom Transformer
目前正在我的 spark-shell 中使用自定义变形金刚,同时使用 spark 2.0.1 和 2.2.1。
在编写自定义 ml 转换器时,为了将其添加到管道中,我注意到复制方法的覆盖存在问题。
在我的例子中,复制方法是由 TrainValidationSplit 的 fit 方法调用的。
我得到的错误:
java.lang.NoSuchMethodException: Custom.<init>(java.lang.String)
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.getConstructor(Class.java:1825)
at org.apache.spark.ml.param.Params$class.defaultCopy(params.scala:718)
at org.apache.spark.ml.PipelineStage.defaultCopy(Pipeline.scala:42)
at Custom.copy(<console>:16)
... 48 elided
然后我尝试直接调用复制方法,但我仍然得到同样的错误。
这是我的类和我执行的调用:
import org.apache.spark.ml.Transformer
import org.apache.spark.sql.{Dataset, DataFrame}
import org.apache.spark.sql.types.{StructField, StructType, DataTypes}
import org.apache.spark.ml.param.{Param, ParamMap}
// Simple DF
val doubles = Seq((0, 5d, 100d), (1, 4d,500d), (2, 9d,700d)).toDF("id", "rating","views")
class Custom(override val uid: String) extends org.apache.spark.ml.Transformer {
def this() = this(org.apache.spark.ml.util.Identifiable.randomUID("custom"))
def copy(extra: org.apache.spark.ml.param.ParamMap): Custom = {
defaultCopy(extra)
}
override def transformSchema(schema: org.apache.spark.sql.types.StructType): org.apache.spark.sql.types.StructType = {
schema.add(org.apache.spark.sql.types.StructField("trending", org.apache.spark.sql.types.IntegerType, false))
}
def transform(df: org.apache.spark.sql.Dataset[_]): org.apache.spark.sql.DataFrame = {
df.withColumn("trending", (df.col("rating") > 4 && df.col("views") > 40))
}
}
val mycustom = new Custom("Custom")
// This call throws the exception.
mycustom.copy(new org.apache.spark.ml.param.ParamMap())
有谁知道这是否是一个已知问题?我好像到处都找不到。
是否有另一种方法可以在自定义转换器中实现复制方法?
谢谢
这些是我要更改的关于您的自定义 Transformer 的几处内容(也是为了启用您的 PipelineModel 的 SerDe 操作):
- 实施 DefaultParamsWritable 特征
- 添加扩展 DefaultParamsReadable 接口的 Companion 对象
例如
class Custom(override val uid: String) extends Transformer
with DefaultParamsWritable {
...
...
}
object Custom extends DefaultParamsReadable[Custom]
如果您只有 1 Input/Output 列,请查看 UnaryTransformer。
最后,究竟需要调用mycustom.copy(new ParamMap())
什么?
目前正在我的 spark-shell 中使用自定义变形金刚,同时使用 spark 2.0.1 和 2.2.1。
在编写自定义 ml 转换器时,为了将其添加到管道中,我注意到复制方法的覆盖存在问题。
在我的例子中,复制方法是由 TrainValidationSplit 的 fit 方法调用的。
我得到的错误:
java.lang.NoSuchMethodException: Custom.<init>(java.lang.String)
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.getConstructor(Class.java:1825)
at org.apache.spark.ml.param.Params$class.defaultCopy(params.scala:718)
at org.apache.spark.ml.PipelineStage.defaultCopy(Pipeline.scala:42)
at Custom.copy(<console>:16)
... 48 elided
然后我尝试直接调用复制方法,但我仍然得到同样的错误。
这是我的类和我执行的调用:
import org.apache.spark.ml.Transformer
import org.apache.spark.sql.{Dataset, DataFrame}
import org.apache.spark.sql.types.{StructField, StructType, DataTypes}
import org.apache.spark.ml.param.{Param, ParamMap}
// Simple DF
val doubles = Seq((0, 5d, 100d), (1, 4d,500d), (2, 9d,700d)).toDF("id", "rating","views")
class Custom(override val uid: String) extends org.apache.spark.ml.Transformer {
def this() = this(org.apache.spark.ml.util.Identifiable.randomUID("custom"))
def copy(extra: org.apache.spark.ml.param.ParamMap): Custom = {
defaultCopy(extra)
}
override def transformSchema(schema: org.apache.spark.sql.types.StructType): org.apache.spark.sql.types.StructType = {
schema.add(org.apache.spark.sql.types.StructField("trending", org.apache.spark.sql.types.IntegerType, false))
}
def transform(df: org.apache.spark.sql.Dataset[_]): org.apache.spark.sql.DataFrame = {
df.withColumn("trending", (df.col("rating") > 4 && df.col("views") > 40))
}
}
val mycustom = new Custom("Custom")
// This call throws the exception.
mycustom.copy(new org.apache.spark.ml.param.ParamMap())
有谁知道这是否是一个已知问题?我好像到处都找不到。
是否有另一种方法可以在自定义转换器中实现复制方法?
谢谢
这些是我要更改的关于您的自定义 Transformer 的几处内容(也是为了启用您的 PipelineModel 的 SerDe 操作):
- 实施 DefaultParamsWritable 特征
- 添加扩展 DefaultParamsReadable 接口的 Companion 对象
例如
class Custom(override val uid: String) extends Transformer
with DefaultParamsWritable {
...
...
}
object Custom extends DefaultParamsReadable[Custom]
如果您只有 1 Input/Output 列,请查看 UnaryTransformer。
最后,究竟需要调用mycustom.copy(new ParamMap())
什么?