如何在 Greenplum/Postgres 中使用 PL/R 反序列化模型对象?
Posted
技术标签:
【中文标题】如何在 Greenplum/Postgres 中使用 PL/R 反序列化模型对象?【英文标题】:How can I unserialize a model object using PL/R in Greenplum/Postgres? 【发布时间】:2018-08-16 01:15:25 【问题描述】:通过 PL/R 在 Greenplum 中反序列化模型对象时出错
我将模型对象存储在 greenplum 数据库(开源版本)中,并且我已经成功地能够序列化我的模型对象,将它们插入到 greenplum 中的表中,并在需要时取消序列化,但是使用安装在我的 R 版本 3.5机器(本地)。这是下面成功运行的R代码:
代码:
fromtable = 'modelObjDevelopment'
mod.id = '7919'
model_obj <-
dbGetQuery(conn,
sprintf("SELECT val from standard.%s where model_id::int = '%s';",
fromtable, mod.id))
iter_model <- postgresqlUnescapeBytea(model_obj)
lm_obj_back <- unserialize(iter_model)
summary(lm_obj_back)
最近,我在 greenplum 上安装了 PL/R,其中包含我通常使用的所有必要库。我正在尝试重新创建在本地 R 中使用的代码(如上所述)以在 greenplum 上运行。经过大量研究,我一直在尝试运行以下转换后的代码,该代码不断失败并给我同样的错误。
代码:
DROP FUNCTION IF EXISTS mdl_load(val bytea);
CREATE FUNCTION mdl_load(val bytea)
RETURNS text AS
$$
require("RPostgreSQL")
iter_model<-postgresqlUnescapeBytea(val)
model<-unserialize(iter_model)
return(length(val))
$$
LANGUAGE 'plr';
select length(val::bytea) as len, mdl_load(val) as t
from modelObjDevelopment
where model_id::int = 7919
此时我不在乎返回什么,我只想让反序列化函数工作。
错误:
[22000] 错误:R 解释器表达式评估错误详细信息:反序列化错误(iter_model):未知输入格式其中:在 PL/R 函数 mdl_load 中
希望有人遇到类似的问题,并且可能对我有所帮助。似乎 bytea 对象在传递到 Pl/R 后会改变大小。我是这种方法的新手,希望有人能提供帮助。
【问题讨论】:
能否请您也发布代码以保存模型?谢谢! 【参考方案1】: $$
require(RPostgreSQL)
## load the PostgresSQL driver
drv <- dbDriver("PostgreSQL")
## connect to the default db
con <- dbConnect(drv, dbname = 'XXX')
rows<-dbGetQuery(con, 'SELECT encode(val::bytea,'escape') from standard.modelObjDevelopment where model_id::int=1234')
iter_model<-postgresqlUnescapeBytea(rows[[model_obj_column]])
model<-unserialize(iter_model)
$$
我们一起解决了这个问题。对于将来访问此站点的人来说,在 R 代码中获取和反序列化模型对象是可行的方法。
【讨论】:
能否请您也发布代码以保存模型?谢谢!以上是关于如何在 Greenplum/Postgres 中使用 PL/R 反序列化模型对象?的主要内容,如果未能解决你的问题,请参考以下文章
Spark Streaming 加入 GreenPlum/Postgres 数据。方法