Как я могу десериализовать объект модели, используя PL/R в Greenplum/Postgres?

Ошибка десериализации объекта модели в Greenplum через PL/R

Я храню объекты модели в базе данных 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)

Недавно я установил PL/R на greenplum со всеми необходимыми библиотеками, которые я обычно использую. Я пытаюсь воссоздать код, который я использую в локальном 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 ответ

Решение
  $$
  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 - это путь.

Другие вопросы по тегам