如何使用 Greenplum/Postgres 中的 PL/R 反序列化模型对象?
How can I unserialize a model object using PL/R in Greenplum/Postgres?
通过 PL/R
在 Greenplum 中反序列化模型对象时出错
我将模型对象存储在 greenplum 数据库(开源版本)中,并且我已经成功地序列化了我的模型对象,将它们插入到 greenplum 中的 table 中并在需要时反序列化,但是使用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
在这一点上我不关心我 return,我只希望 unserialize 函数起作用。
错误:
[22000] ERROR: R interpreter expression evaluation error Detail: Error in unserialize(iter_model) : unknown input format Where: In PL/R function mdl_load
希望有人遇到过类似的问题,并可能为我提供线索。似乎 bytea 对象在传入 Pl/R 后改变了大小。我是这个方法的新手,希望有人能提供帮助。
$$
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 代码中的模型对象是必经之路。
通过 PL/R
在 Greenplum 中反序列化模型对象时出错我将模型对象存储在 greenplum 数据库(开源版本)中,并且我已经成功地序列化了我的模型对象,将它们插入到 greenplum 中的 table 中并在需要时反序列化,但是使用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
在这一点上我不关心我 return,我只希望 unserialize 函数起作用。
错误:
[22000] ERROR: R interpreter expression evaluation error Detail: Error in unserialize(iter_model) : unknown input format Where: In PL/R function mdl_load
希望有人遇到过类似的问题,并可能为我提供线索。似乎 bytea 对象在传入 Pl/R 后改变了大小。我是这个方法的新手,希望有人能提供帮助。
$$
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 代码中的模型对象是必经之路。