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

此时我不在乎我返回什么,我只希望反序列化函数工作。

错误:

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

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

4

1 回答 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 代码中获取和反序列化模型对象是要走的路。

于 2018-08-16T23:37:39.040 回答