Ich versuche, einen erfolgreichen R-Code mit Rpostgresql in einen PL/R-Code zu konvertieren, um zu vermeiden, push/ziehen Daten in und aus der Postgreql-Datenbank.Push R-Code zu PL/R-Code in Postgresql-Datenbank
-Code ist ein dcast auf einem data.table:
#libs
library(RPostgreSQL);
library(data.table);
# connect
drv <- dbDriver("PostgreSQL");
con <- dbConnect(drv, dbname="postgres", user="postgres");
# load
cli_ranges <- dbGetQuery(con, "SELECT custid, prod_ranges, is_cli from cli_ranges;")
# DT
setDT(cli_ranges)
setkeyv(cli_ranges , c("prod_ranges"))
# pivot
cli_ranges.pivoted <- dcast(cli_ranges, custid ~ paste0("is_cli_", prod_ranges), fun=sum, value.var = "is_cli")
# send back to DB
dbWriteTable(con, "cli_ranges_pivoted", cli_ranges.pivoted, row.names=F)
-Code in R arbeitet gut & schnell.
ich jetzt versuchen, den Code in einer PL/R-Funktion zu drücken,
CREATE OR REPLACE FUNCTION public.pivot()
RETURNS void AS
$BODY$
[copy/paste R code]
$BODY$
LANGUAGE plr;
... aber die letzte Zeile des R-Code (dbWriteTable
) wirft:
ERROR: R interpreter expression evaluation error
DETAIL: Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function 'dbWriteTable' for signature '"logical", "character", "data.frame"'
CONTEXT: In PL/R function pivot
ändern Die data.table zu einem Datenrahmen (as.data.frame(cli_ranges.pivoted)
) funktioniert auch nicht.
Ein Trick könnte sein, den data.table/Frame zurückzukehren, um ein CREATE TABLE cli_ranges_pivoted AS SELECT pivot();
auszuführen, aber ich weiß nicht wirklich, wie die data.frame als Ausgang schieben ...
cli_ranges
Tabelle:
custid prod_ranges is_cli
1 A 1
1 B 1
1 C 0
2 A 1
2 B 0
2 C 1
3 A 0
3 B 1
3 C 0
4 A 1
... ... ...
Nach dcast (dh Schwenk) datafram ist wie folgt:
custid prod_ranges_A prod_ranges_B prod_ranges_C
1 1 1 0
2 1 0 1
3 0 1 0
4 1 ...
...
Anzahl unterschiedlicher Werte in prod_ranges
chang Es ist oft, so kann ich im Voraus die Anzahl der Spalten nach der Schwenkung definieren.
Env: Postgresql 9.5, R 3.3, PL/R 08.03.00.16, Win 10 64bits
Das Problem ist, dass sich die Anzahl der 'prod_ranges' im Laufe der Zeit ändert, dh ich kann nicht definieren, wieviele Spalten es durch'cast} gibt (die meine Tabelle über die' prod_ranges' Werte transponiert). – ant1j
Können Sie ein Beispiel dafür angeben Ihre Eingabe für die Übertragung oder Ausgabe (gefälschte Zahlen usw.)? – DDrake
Illustration zur Verfügung gestellt in der ursprünglichen Frage – ant1j