如何在数据库中保留 Spark MLlib 模型?
How to persist Spark MLlib model in a database?
我已经设置并训练了 MultilayerPerceptronClassificationModel
(与 this 教程中的方式相同),现在我想保留它以便下次需要时重用神经网络对一些数据进行分类。该模型具有 load
和 save
方法,可以在文件中保存和恢复。但是有没有办法在数据库中保存(以及稍后加载)模型? (在我的例子中是 CassandraDB)。
好的,我自己找到了答案。不确定这是最好的解决方案,但对我来说效果很好。
MultilayerPerceptronClassificationModel
(据我所知,MLlib
包的每个模型)都实现了 Serializable
接口。所以它可能是 serialized/deserialized 作为 ByteArray
.
让我们制作一个 table 用于在 Cassandra DB 中存储模型:
CREATE TABLE models (
uid TEXT,
name TEXT,
model BLOB,
PRIMARY KEY (uid)
);
现在我们可以将模型写入数据库:
def saveModel(model: MultilayerPerceptronClassificationModel) = {
val baos = new ByteArrayOutputStream()
val oos = new ObjectOutputStream(baos)
oos.writeObject(model)
oos.flush()
oos.close()
sc.parallelize(Seq((model.uid, "my-neural-network-model", baos.toByteArray)))
.saveToCassandra("mykeyspace", "models", SomeColumns("uid", "name", "model"))
}
并读回模型:
def loadModel(): MultilayerPerceptronClassificationModel = {
sc.cassandraTable("mykeyspace", "models").map { r =>
val bis = new ByteArrayInputStream(r.getBytes("model").array())
val ois = new ObjectInputStream(bis)
ois.readObject.asInstanceOf[MultilayerPerceptronClassificationModel]
}.first()
}
我已经设置并训练了 MultilayerPerceptronClassificationModel
(与 this 教程中的方式相同),现在我想保留它以便下次需要时重用神经网络对一些数据进行分类。该模型具有 load
和 save
方法,可以在文件中保存和恢复。但是有没有办法在数据库中保存(以及稍后加载)模型? (在我的例子中是 CassandraDB)。
好的,我自己找到了答案。不确定这是最好的解决方案,但对我来说效果很好。
MultilayerPerceptronClassificationModel
(据我所知,MLlib
包的每个模型)都实现了 Serializable
接口。所以它可能是 serialized/deserialized 作为 ByteArray
.
让我们制作一个 table 用于在 Cassandra DB 中存储模型:
CREATE TABLE models (
uid TEXT,
name TEXT,
model BLOB,
PRIMARY KEY (uid)
);
现在我们可以将模型写入数据库:
def saveModel(model: MultilayerPerceptronClassificationModel) = {
val baos = new ByteArrayOutputStream()
val oos = new ObjectOutputStream(baos)
oos.writeObject(model)
oos.flush()
oos.close()
sc.parallelize(Seq((model.uid, "my-neural-network-model", baos.toByteArray)))
.saveToCassandra("mykeyspace", "models", SomeColumns("uid", "name", "model"))
}
并读回模型:
def loadModel(): MultilayerPerceptronClassificationModel = {
sc.cassandraTable("mykeyspace", "models").map { r =>
val bis = new ByteArrayInputStream(r.getBytes("model").array())
val ois = new ObjectInputStream(bis)
ois.readObject.asInstanceOf[MultilayerPerceptronClassificationModel]
}.first()
}