2016-01-11 91 views
0

在版本1.6中,管道API獲得了一組保存和加載管道階段的新功能。在我訓練分類器並在稍後再次加載以重用它並節省計算再次建模的成本時,我試圖將一個階段保存到磁盤。Spark V1管道API保存不工作

由於某些原因,當我保存模型時,該目錄只包含元數據目錄。當我再次嘗試加載它,我得到以下異常:線程「main」 java.lang.UnsupportedOperationException

例外: 空收集在 org.apache.spark.rdd.RDD $$ anonfun $第一$ 1.適用(RDD.scala:1330)在 org.apache.spark.rdd.RDDOperationScope $ .withScope(RDDOperationScope.scala:150) 在 org.apache.spark.rdd.RDDOperationScope $ .withScope(RDDOperationScope.scala :111) at org.apache.spark.rdd.RDD.withScope(RDD.scala:316)at org.apache.spark.rdd.RDD.first(RDD.scala:1327)at 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) 在 組織.tes t.categoryminer.spark.SparkTextClassifierModelCache.get(SparkTextClassifierModelCache.java:34)

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

,並加載它,我用:CrossValidatorModel.load("/tmp/my.model")

我打電話節省我在CrossValidator對象上調用fit(dataframe)時獲得的CrossValidatorModel對象。

任何指針爲什麼只保存元數據目錄?

回答

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

感謝,將測試它儘快 – Johnny000

+0

感覺錯了 - 但偉大工程! – Johnny000