如何在 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 数据。方法

在 Greenplum(Postgres 8.4)中进行多行更新时跟踪错误记录?

jdbc 写入 greenplum/postgres 问题

无法在 psql GreenPlum 中分发

如何在 JSF 2.0 中使会话无效?

如何在 TypeScript 中使装饰器类型安全?