Как я могу десериализовать объект модели, используя 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 - это путь.