viernes, abril 16, 2010

Configuración y ejecución con PL / R (PLR) en PostgreSQL

Algunos de los datos aquí provistos, provienen de [0], los cuales se encuentran en Inglés.

R es tanto un lenguaje como un medio para hacer el análisis estadístico. R está disponible como software libre bajo la GPL. Para aquellos familiarizados con entornos como S, MatLab, y SAS - R tiene el mismo propósito. Tiene poderosas construcciones para la manipulación de matrices, los paquetes para importar datos de fuentes de datos diversas como bases de datos relacionales, csv, hojas de cálculo, entre otras.

PL / R es una extensión del lenguaje de PostgreSQL que le permite escribir funciones PostgreSQL y funciones de agregación en el lenguaje estadístico R.

Con el lenguaje R puede escribir cosas como funciones de agregación para calcular la mediana, que no existe de forma nativa en PostgreSQL y sólo existe en una pocas bases de datos relacionales de forma nativa (por ejemplo Oracle) se me ocurre. Incluso en la función de Oracle no aparece hasta la versión 10.

Otro uso popular de R es para hacer diagramas de Voronoi...

Cuando se combina esto con PostGIS tiene un ambiente extremadamente poderoso para hacer cosas como vecino más cercano y búsquedas planeación de instalaciones.

Instalando R

En Debian Linux, aptitude install r-cran-base para obtener R. Sí a alguien se le ocurre hacer un search podrá encontrar un montón de cosas adicionales para R, como módulos por ejemplo, que cada quien instalará según necesite o quiera.

Instalando PL/R

En la lista de postgresql-es, cuando pregunté, Alvaro Herrera me respondió: "¿Probaste apt-get install postgresql-8.3-plr ?". ciertamente lo había buscado en los repos de Debian, pensando que quizás existía, y no lo había encontrado, asumí que sólo conseguiría el tar.gz de la página oficial de PL/R [1], pero, se me ocurrió preguntarle a google y zas! Ubuntu sí que lo tiene en un repos, así que me descargue el .deb a ver qué tal me iba, y bueno... dpkg -i y listo!

Por ahí leí que había que decirle a postgresql dónde está R, y la seña era agregar R_HOME = '/usr/lib/R/' a environment de postresql (en /etc). Reiniciar postgresql

Agregando el lenguaje a la BD

Luego, me di cuenta que un simple createlang plr no funcionaba, así que volví a google y... [2] psql -d mi_bd < /usr/share/postgresql/8.3/plr.sql. Ojo, es posible que esté en otro lado

Probando PL/R

SELECT * FROM plr_environ();
SELECT load_r_typenames();
SELECT * FROM r_typenames();
SELECT plr_array_accum('{23,35}', 42);

Next try to create a helper function (this was copied from (http://www.joeconway.com/plr/doc/plr-pgsql-support-funcs.html) - and test with the following

CREATE OR REPLACE FUNCTION plr_array (text, text) RETURNS text[] AS '$libdir/plr','plr_array' LANGUAGE 'C' WITH (isstrict);
select plr_array('hello','world');

Creating Median Function in PostgreSQL using R

create or replace function r_median(_float8) returns float as 'median(arg1)' language 'plr';
CREATE AGGREGATE median (sfunc = plr_array_accum, basetype = float8, stype = _float8, finalfunc = r_median );
create table foo(f0 int, f1 text, f2 float8);
insert into foo values(1,'cat1',1.21);
insert into foo values(2,'cat1',1.24);
insert into foo values(3,'cat1',1.18);
insert into foo values(4,'cat1',1.26);
insert into foo values(5,'cat1',1.15);
insert into foo values(6,'cat2',1.15);
insert into foo values(7,'cat2',1.26);
insert into foo values(8,'cat2',1.32);
insert into foo values(9,'cat2',1.30);
select f1, median(f2) from foo group by f1 order by f1;
[0]http://www.bostongis.com/PrinterFriendly.aspx?content_name=postgresql_plr_tut01
[1]http://www.joeconway.com/web/guest/pl/r
[2]http://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg589297.html