【问题标题】:Spark ML Pipeline api save not workingSpark ML Pipeline api保存不起作用
【发布时间】:2016-01-12 23:44:58
【问题描述】:

在 1.6 版中,管道 api 获得了一组新功能来保存和加载管道阶段。在我训练了一个分类器并稍后再次加载它以重用它并节省计算再次建模的工作量之后,我尝试将一个阶段保存到磁盘。

由于某种原因,当我保存模型时,该目录仅包含元数据目录。当我尝试再次加载它时,出现以下异常:

线程“主”java.lang.UnsupportedOperationException 中的异常: 空集合在 org.apache.spark.rdd.RDD$$anonfun$first$1.apply(RDD.scala:1330) 在 org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:150) 在 org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:111) 在 org.apache.spark.rdd.RDD.withScope(RDD.scala:316) 在 org.apache.spark.rdd.RDD.first(RDD.scala:1327) 在 org.apache.spark.ml.util.DefaultParamsReader$.loadMetadata(ReadWrite.scala:284) 在 org.apache.spark.ml.tuning.CrossValidator$SharedReadWrite$.load(CrossValidator.scala:287) 在 org.apache.spark.ml.tuning.CrossValidatorModel$CrossValidatorModelReader.load(CrossValidator.scala:393) 在 org.apache.spark.ml.tuning.CrossValidatorModel$CrossValidatorModelReader.load(CrossValidator.scala:384) 在 org.apache.spark.ml.util.MLReadable$class.load(ReadWrite.scala:176) 在 org.apache.spark.ml.tuning.CrossValidatorModel$.load(CrossValidator.scala:368) 在 org.apache.spark.ml.tuning.CrossValidatorModel.load(CrossValidator.scala) 在 org.test.categoryminer.spark.SparkTextClassifierModelCache.get(SparkTextClassifierModelCache.java:34)

保存我使用的模型:crossValidatorModel.save("/tmp/my.model")

并加载它我使用:CrossValidatorModel.load("/tmp/my.model")

当我在 CrossValidator 对象上调用 fit(dataframe) 时,我在 CrossValidatorModel 对象上调用 save。

任何指针为什么它只保存元数据目录?

【问题讨论】:

    标签: java apache-spark apache-spark-ml


    【解决方案1】:

    这肯定不会直接回答你的问题,但是我个人没有测试1.6.0的新功能。

    我正在使用专用功能来保存模型。

      def saveCrossValidatorModel(model:CrossValidatorModel, path:String)
      {
        try {
              val fileOut:FileOutputStream  = new FileOutputStream(path)
              val out:ObjectOutputStream  = new ObjectOutputStream(fileOut)
              out.writeObject(model)
              out.close()
              fileOut.close()
          } catch {
            case foe:FileNotFoundException =>
              foe.printStackTrace()
            case ioe:IOException =>
              ioe.printStackTrace()
          }
      }
    

    然后你可以用类似的方式读取你的模型:

      def loadCrossValidatorModel(path:String): CrossValidatorModel =
      {
        try {
          val fileIn:FileInputStream = new FileInputStream(path)
          val in:ObjectInputStream  = new ObjectInputStream(fileIn)
          val cvModel = in.readObject().asInstanceOf[CrossValidatorModel]
          in.close()
          fileIn.close()
          cvModel
        } catch {
            case foe:FileNotFoundException =>
              foe.printStackTrace()
            case ioe:IOException =>
              ioe.printStackTrace()
          }
      }
    

    【讨论】:

    • 谢谢,会尽快测试
    猜你喜欢
    • 2016-07-14
    • 2016-05-23
    • 2016-10-17
    • 2020-02-17
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 2018-02-17
    相关资源
    最近更新 更多