Невозможно запустить преобразование во время выполнения Mleap из модели Spark - PullRequest
0 голосов
/ 07 июня 2019

В настоящее время я тестирую решение 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

Часть "Features" - это набор сгруппированных столбцов. Я перепробовал много вещей, но не повезло:

                          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 голосов
/ 26 июня 2019

Ответьте себе: начинать с примеров Spark не очень хорошая идея, поскольку данные уже представлены в формате libsvm и такие функции уже собраны в векторе.Похоже, что в этой ситуации картирование невозможно.Но, начиная с базового примера с полным конвейером (vectorassembler + ml), он отлично работает

...