Hasta ahora...he integrado R y SAP HANA via ODBC y via la integracion SAP HANA-R...pero habia dejado completamente de lado la capacidad OData de SAP HANA.
Para este blog, vamos a crear un simple Attribute View, exponerlo via SAP HANA y luego consumirlo con R para mostrar un bonito e impresionante grafico -;)
Primero, creemos el Attribute View y llamemoslo FLIGHTS. Este Attribute View estara compuesto por las tablas SPFLI, SCARR y SFLIGHT y va a devolver los campos PRICE, CURRENCY, CITYFROM, CITYTO, DISTANCE, CARRID y CARRNAME. Si se preguntan porque tantos campos? Solo para poder utilizarlos en otros campos -;)
Con el Attribute View listo, podemos crear un proyecto en el repositorio y los archivos necesarios para exponer el servicio OData.
Primero, creamos el archivo .xsapp...que deberia estar vacio -:P
Luego, creamos el archivo .xsaccess con el siguiente codigo...
| .xsaccess |
|---|
{
"exposed" : true,
"authentication" : [ { "method" : "Basic" } ]
}
|
Finalmente, creamos el archivo llamado flights.xsodata
| flights.xodata |
|---|
service {
"BlagStuff/FLIGHTS.attributeview" as "FLIGHTS" keys generate local "Id";
}
|
Con todo listo...podemos llamar a nuestro servicio para probarlo...podemos llamarlo ya sea como JSON o XML. Para este ejemplo, vamos a llamarlo como XML.
Ahora que sabemos que esta funcionando...podemos ir y programar en R -:D Para esto...vamos a necesitar 3 paquetes (Que pueden instalar via RStudio o en el mismo R), ggplot2, RCurl y XML.
| HANA_OData_and_R.R |
|---|
library("ggplot2")
library("RCurl")
library("XML")
web_page = getURL("XXX:8000/BlagStuff/flights.xsodata/FLIGHTS?$format=xml", userpwd = "SYSTEM:******")
doc <- xmlTreeParse(web_page, getDTD = F,useInternalNodes=T)
r <- xmlRoot(doc)
carrid<-list()
carrid_list<-list()
carrid_big_list<-list()
price<-list()
price_list<-list()
price_big_list<-list()
currency<-list()
currency_list<-list()
currency_big_list<-list()
for(i in 5:xmlSize(r)){
carrid[1]<-xmlValue(r[[i]][[5]][[1]][[2]])
carrid_list[i]<-carrid[1]
price[1]<-xmlValue(r[[i]][[5]][[1]][[8]])
price_list[i]<-price[1]
currency[1]<-xmlValue(r[[i]][[5]][[1]][[7]])
currency_list[i]<-currency[1]
}
carrid_big_list<-unlist(carrid_list)
price_big_list<-unlist(price_list)
currency_big_list<-unlist(currency_list)
flights_table<-data.frame(CARRID=as.character(carrid_big_list),PRICE=as.numeric(price_big_list),
CURRENCY=as.character(currency_big_list))
flights_agg<-aggregate(PRICE~.,data=flights_table, FUN=sum)
flights_agg<-flights_agg[order(flights_agg$CARRID),]
flights_table<-data.frame(CARRID=as.character(flights_agg$CARRID),PRICE=as.character(flights_agg$PRICE),
CURRENCY=as.character(flights_agg$CURRENCY))
ggplot(flights_table, aes(x=CARRID, y=PRICE, fill=CURRENCY)) + geom_histogram(binwidth=.5,
position="dodge", stat="identity")
|
Basicamente, estamos leyendo el servicio OData que viene en formato XML y convertirlo en un arbol para poder extraer sus componentes. Algo que puede llamar su atencion es que estamos usando xmlValue(r[[i]][[5]][[1]][[2]]) donde i comienza en 5.
Bueno...hay una explicacion sencilla -:) si accedemos nuestro arbol XML...el primer valor va a ser "feed", el segundo "id" y asi sigue...el quinto va a ser "entry" que es el que necesitamos. Luego para el siguiente [[5]]...dentro de "entry", el primer valor va a ser "id", el segundo "title" y asi sigue...el quinto va a ser "content" que es el que necesitamos. Luego para el siguiente [[1]]...dentro de "content", el primer valor va a ser "properties" que es el que necesitamos. Y para el ultimo [[2]]...dentro de "properties" el primer valor va a ser "id" y el segundo va a ser "carrid" que es el que necesitamos. Por cierto, xmlValue va a obtener el valor del tag XML -:P
En otras palabras...necesitamos analizar el esquema XML y determinar que debemos extraer...luego de eso, simplemente debemos asignar los valores a variables y crear nuestro data.frame.
Luego creamos una agregacion para sumar el valor del campo PRICE (En otras palabras, vamos a tener el campo PRICE agrupado por CARRID y CURRENCY), luego ordenamos los valores y finalmente creamos un nuevo data.frame para que podamos tener el campo PRICE como un caracter en vez de un numerico...solo para mejor presentacion del grafico...
Finalmente...llamamos al plot y estamos listos -:)
Feliz plotting! -:)
Saludos,
Blag.



No comments:
Post a Comment