Spark ML Pipeline api保存不起作用

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

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

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

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

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

我调用了在CrossValidator对象上调用fit(dataframe)时得到的CrossValidatorModel对象的save。

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

这肯定不会直接回答你的问题,但我个人并未测试1.6.0中的新function。

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

  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() } }