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

时间:2018-08-16 01:15:25

标签: r postgresql greenplum plr

通过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解释器表达式求值错误详细信息:unserialize(iter_model)错误:输入格式未知其中:在PL / R函数mdl_load中

希望有人遇到类似的问题,可能对我有帮助。看起来bytea对象在传递到P1 / R之后会更改大小。我是这种方法的新手,希望有人能提供帮助。

1 个答案:

答案 0 :(得分: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代码中获取和反序列化模型对象是解决问题的方法。