首页 文章

如何在Greenplum / Postgres中使用PL / R反序列化模型对象?

提问于
浏览
1

错误通过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

此时我并不关心我返回的内容,我只想让unserialize函数起作用 .

错误:

[22000]错误:R解释器表达式评估错误详细信息:反序列化错误(iter_model):未知输入格式其中:在PL / R函数中mdl_load

希望有人有类似的问题,可能对我有所了解 . 似乎bytea对象在传递到Pl / R后会改变大小 . 我是这种方法的新手,希望有人可以提供帮助 .

1 回答

  • 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代码中的模型对象是要走的路 .

相关问题