无法通过Spark模型在Mleap运行时中运行转换

时间:2019-06-07 10:06:33

标签: scala mleap

我目前正在测试Mleap解决方案,以便对Spark模型进行预测。为此,我首先实现了用于线性回归的Spark示例,如下所述:https://spark.apache.org/docs/2.3.0/ml-classification-regression.html#linear-regression 我已经能够将模型保存在Mleap捆绑包中,并在另一个Spark上下文中重用。 现在,我想在Mleap运行时中使用此捆绑包,但是我遇到了一些强制转换问题,无法使其正常工作

错误来自架构定义:

       val dataSchema = StructType(Seq(
                          StructField("label", ScalarType.Double),
                          StructField("features", ListType.Double)
                        )).get

“功能”部分是一组分组的列。我尝试了很多事情,但是没有运气:

                          StructField("label", ScalarType.Double),
                          StructField("features", ListType.Double)
                        )).get

=>这给了我

java.lang.IllegalArgumentException: Cannot cast ListType(double,true) to TensorType(double,Some(WrappedArray(10)),true)

所以我尝试了:

       val dataSchema = StructType(Seq(
                          StructField("label", ScalarType.Double),
                          StructField("features", TensorType.Double(10))
                        )).get

但这给了我

java.lang.ClassCastException: scala.collection.immutable.$colon$colon cannot be cast to ml.combust.mleap.tensor.Tensor

这是整个代码段:

    val dataSchema = StructType(Seq(
                  StructField("label", ScalarType.Double),
                  StructField("features", TensorType.Double(10))
               )).get
    val data = Seq(Row(-9.490009878824548, Seq(0.4551273600657362, 0.36644694351969087, -0.38256108933468047, -0.4458430198517267, 0.33109790358914726,0.8067445293443565, -0.2624341731773887,-0.44850386111659524,-0.07269284838169332, 0.5658035575800715)))

    val bundle = (for(bundleFile <- managed(BundleFile("jar:file:/tmp/spark-lrModel.zip"))) yield {
          bundleFile.loadMleapBundle().get
    }).tried.get

   var model = bundle.root
   val to_test = DefaultLeapFrame(dataSchema, data)
   val res = model.transform(to_test).get // => Here is the place which raises the exception

现在,使用此类型映射我有些迷茫。有想法吗?

谢谢

史蒂芬(Stéphane)

1 个答案:

答案 0 :(得分:0)

对我自己的答案:从Spark示例开始并不是一个好主意,因为数据已经采用libsvm格式,并且这些功能已经收集在矢量中。在这种情况下,似乎无法进行映射。 但是从具有完整管道(vectorassembler + ml)的基本示例开始,它可以很好地工作