我正在编写一段Scala代码,可以为我构建一个来自配置文件的Spark-ML管道。我希望能够实例化扩展 Params 类(即 PipelineStage )和 Pipeline 本身的对象。
pipeline {
class = "org.apache.spark.ml.Pipeline"
stages = ["pca", "vectorAssembler"]
vectorAssembler {
class = "org.apache.spark.ml.feature.VectorAssembler"
inputCols = ["pcacol","col1","col2","col3"]
outputCol = "features"
}
pca {
....
}
}
目前我通过调用 Params#set 方法实例化类并设置参数。 我希望解析器尽可能通用,我希望能够设置任何类型的参数,包括privitives,基元数组和对象数组(例如 Pipeline#stages )。 问题是我无法区分设定者的类型参数。我查看所需参数的类型并将配置值转换为此类型。
param match {
case p: DoubleArrayParam =>
...
case p: IntArrayParam =>
...
case p: StringArrayParam =>
...
case p: Param[Array[Params]] =>
...
case p =>
...
在运行时 Param [String] , Param [Array [String]] 和 Param [Array [Params]] 是相同的。对于字符串数组和基元数组,有单独的类, DoubleArrayParam , IntArrayParam , StringArrayParam ,但我无法找到方法从简单的 String 中告诉 Params 数组,因为Param [Any]匹配上面代码中的倒数第二个案例。
我遇到的唯一解决方案是分别解析 Pipeline 配置,但这意味着我将来可能会遇到其他特定情况。