Thursday, July 25, 2013

SAP HANA y R - Siguen brillando

Desde que descubri Shiny y publique mi blog Un ejemplo brillante - SAP HANA, R y Shiny siempre quise correr una aplicacion Shiny del SAP HANA Studio, en vez de tener que llamarlo del RStudio y tener que utilizar una conexion ODBC.

Hace unos dias...este blog Let R Embrace Data Visualization in HANA Studio me dio el poder que necesitaba para poder seguir trabajando en esto...pero por supuesto...la vida no es tan bonita asi que aun tuve que hacer muchas cosas para que esto funcionara...

Primer...cygwin no me funciono -:(  asi que utilice Xming -;)

Ahora...una de las cosas que es realmente importante tener es todos los paquetes X11 cargados en el servidor de R...asi que simplemente hagan esto...

Conectense a su Servidr de R usando Putty y luego escriban "yast" para entrar al "Yet another setup tool". (Asegurense se hacer click en X11 Forwarding)...


Busquen e instalen todo lo relacionado con X11-Devel. Tambien instalen/actualizen su navegador Firefox browser (tambien en yast).


Cuando eso este listo...podemos continuar -;)

Si ya tienen R instalado...por favor borrenlo...tan facil como esto...

Deleting_R
rm -r R-2.15.0

Luego, descarguen el codigo fuente otra vez...tengan en cuenta que vamos a usar el R-2.15.1

Get_R_Again
wget http://cran.r-project.org/src/base/R-2/R-2.15.1.tar.gz

Ahora...necesitamos soporte para imagenes jpeg...asi que descarguemos un par de archivos...

Getting_support_for_images
wget http://prdownloads.sourceforge.net/libpng/libpng-1.6.3.tar.gz?download
wget http://www.ijg.org/files/jpegsrc.v9.tar.gz
 
tar zxf libpng-1.6.3.tar.gz
tar zxf jpegsrc.v9.tar.gz
 
mv libpng-1.6.3 R-2.15.1/src/gnuwin32/bitmap/libpng
mv jpeg-9 R-2.15.1/src/gnuwin32/bitmap/jpeg-9
 
cd R-2.15.1/src/gnuwin32/
cp MkRules.dist MkRules.local
vi MkRules.local

Cuando ejecuten vi en el archivo deberian descomentar las lineas de la fuente de directorios bitmap.dll tal como en la imagen (tomen en cuenta que no estoy tomando en cuenta las images TIFF, porque no me funcionaron)...


Ahora, debemos ir a cada carpeta y compilar las librerias...

Compiling_libraries
cd R-2.15.1/src/gnuwin32/bitmap/libpng
./confire
make
make install
cd ..
cd jpeg-9
./configure
make
make install

Cuando ambas librerias han terminado de compilar...podemos compilar R -;)

Compiling_R
cd
cd R-2.15.1
./configure --enable-R-shlib --with-readline=no --with-x=yes
make clean
make
make install

Como pueden ver...estamos usando el parametro --with-x=yes para indicar que queremos el X11 en nuestra instalacion de R. Como ya compilamos las librerias JPEG y PNG antes...tendran soporte para R por defecto -;)

Desde luego...esto tomara algun tiempo...la compilacion de R es una tarea muy dura -:P Pero finalmente seran capaces de confirmar la instalacion asi...

Checking_installation
R
capabilities()


Ahora...es hora de instalar Shiny -8)

Installing_Shiny
install.packages("shiny", dependencies=TRUE)

Mas facil no se puede -:)

Pero aqui viene otra parte con trampa...necesitamos crear un nuevo usuario...por que? Porque lo mas seguro es que ya teniamos un usuario para ejecutar Rserve...que fue creado antes de que instalaramos X11...asi que vamos a crear uno nuevo -:)

Creating_new_user
useradd -m login_name
passwd login_name

Para que el X11 funcione perfectamente...necesitamos hacer algo mas...

Get_Magic_Cookie
xauth list
echo $DISPLAY

Esto nos devolvera una linea que debemos copiar en el notepad...luego...debemos salir y logearnos nuevamente via Putty (con el X11 Forwarding) pero esta vez utilizando nuestro nuevo usario...la segunda linea no dira acerca del display, asi que tambien la copiamos...
Una vez logeados con el nuevo usuario...hagamos esto...

Assign_Magic_Cookie_and_Display
xauth add //Magic_Cookie_from_Notepad//
export DISPLAY=localhost:**.* //number get from the $DISPLAY...like 10.0 or 11.0

Ahora...estamos completamente listo para continuar...

Inicien el Rserve asi...

Start_Rserve
R CMD Rserve --RS-port 6311 --no-save --RS-encoding "utf8"

Cuando nuestro Rserve esta listo y funcionando...es hora de que SAP HANA haga su aparicion -;) Lo que me gusta realmente de Shiny...es que...en el pasado tenias que crear dos archivos para que funcionara UI.R y Server.R...ahora...Shiny utiliza el framework Bootstrap para que podamos crear aplicaciones Shiny utilizando un solo archivo...o llamarla directamente desde SAP HANA Studio -;)

Calling_Shiny_from_SAP_HANA_Studio.sql
CREATE TYPE SNVOICE AS TABLE(
CARRID CHAR(3),
FLDATE CHAR(8),
AMOUNT DECIMAL(15,2)
);
 
CREATE TYPE DUMMY AS TABLE(
ID INT
);
 
CREATE PROCEDURE GetShiny(IN t_snvoice SNVOICE, OUT t_dummy DUMMY)
LANGUAGE RLANG AS
BEGIN
library("shiny")
 
runApp(list(
  ui = bootstrapPage(
    pageWithSidebar(
      headerPanel("SAP HANA and R using Shiny"),
      sidebarPanel(selectInput("n","Select Year:",list("2010"="2010","2011"="2011","2012"="2012"))),
      mainPanel(plotOutput('plot', width="100%", height="800px"))
    )),
  server = function(input, output) {
    output$plot <- renderPlot({
      year<-paste("",input$n,sep='')
      t_snvoice$FLDATE<-format(as.Date(as.character(t_snvoice$FLDATE),"%Y%m%d"))
      snvoice<-subset(t_snvoice,format(as.Date(t_snvoice$FLDATE),"%Y") == year)
      snvoice_frame<-data.frame(CARRID=snvoice$CARRID,FLDATE=snvoice$FLDATE,AMOUNT=snvoice$AMOUNT)
      snvoice_agg<-aggregate(AMOUNT~CARRID,data=snvoice_frame,FUN=sum)
      pct<-round(snvoice_agg$AMOUNT/sum(snvoice_agg$AMOUNT)*100)
      labels<-paste(snvoice_agg$CARRID," ",pct,"%",sep="")
      pie(snvoice_agg$AMOUNT,labels=labels)
    })
  }
))
END;
 
CREATE PROCEDURE Call_Shiny()
LANGUAGE SQLSCRIPT AS
BEGIN
snvoice = SELECT CARRID, FLDATE, AMOUNT FROM SFLIGHT.SNVOICE WHERE CURRENCY = 'USD';
CALL GetShiny(:snvoice,DUMMY) WITH OVERVIEW;
END;
 
CALL Call_Shiny

No voy a explicar el codigo, porque deberian de aprender algo de R y Shiny -:P Pero si se preguntan porque tengo una tabla "dummy"...es simplemente porque no puedes crear un Stored Procedure en R Lang que no tenga un parametro OUT...asi que...no hace nada pero ayuda a correr el codigo -:)

Cuando llamamos al script o procedimiento Call_Shiny, el X11 de nuestro servidor va a llamar a Firefox que va a aparecer en nuestro escritorio de la siguiente manera...


Podemos elegir entre 2010, 2011 y 2012...cada vez que escogemos un nuevo valor, el grafico se va a actualizar automaticamente...


Antes de terminar...tengan en cuenta que esta opcion es bastante lenta...nuesto Servidor R va a enviar la informacion via X11 Forwarding hacia nuestra maquina, y va a cargar el browser Firefox...tambien...tenemos un contador...asi que luego de varios segundos...vamos a tener un Timeout...por supuesto esto puede ser configurado, pero para cuestiones de Performance...deberiamos limitar el tiempo de comunicacion entre nuestros servidores de SAP HANA y R...

Espero que les guste este blog -:) nos vemos en el proximo -;)

Saludos,

Blag.

No comments: