R du redo för analys?

Share on FacebookShare on Google+Email this to someoneTweet about this on TwitterShare on LinkedIn

Som titeln säger så skall detta handla om analys, kanske inte en fullvärdig kurs men mer hur du kan använda ditt analysverktyg för att jobba med det data som finns i MarkLogic server.

När det gäller analysverktyg, vare sig det handlar om Business Intelligence, Data Mining, Statistik eller någon annan typ av analys så förlitar sig de flesta verktygen på att data skall komma i ett specifikt format. Oftast handlar det om att det skall vara i rader och kolumner.

En av många fördelar med NoSQL och Big Data är att man oftast inte behöver lagra sitt data i ett rad/kolumn format utan har en större frihetsgrad. Men det gör dock analys med standardverktyg lite mer utmanande.

Alla NoSQL/Big Data lösningar löser detta på olika sätt, vissa inte alls, och kan kräva många olika komponenter från olika leverantörer som kanske kan kan göra det hela lite onödigt komplex.

När det gäller MarkLogic databas så har vi tänkt på detta. Det finns ett sort utbud av analytiska funktioner inbyggda och man har flera möjligheter att komma åt dessa via olika gränssnitt., REST, JavaScript, XQuery eller ODBC/SQL.

Jag tänkte i detta inlägga använda mig av R, som är ett open source språk för analys. R kan använda sig både av ODBC och REST. Givetvis kan du använda vilket analysverktyg du vill, så länge det stödjer något av ovan alternativ, det finns till exempel bra instruktioner på docs.marklogic.com om hur man använder Tableau och IBM Cognos tillsammans med MarkLogic server.

Jag kommer använda mig av samma exempeldatabas, nobelprize, som i tidigare inlägg, så om du vill följa exemplen här så behöver du ha gjort de inläggen först. Vilka du kan hitta här, här och här.

All kod i detta inlägg kan hämtas från GitHub, här och här. Filerna heter R du redo för analys.xml respektive ODBC_ML.R.

Låt oss börja med ODBC.

MarkLogic server ODBC gränssnitt tillåter dig att använda standard SQL via ODBC mot det data som ligger i en MarkLogic databas. Det stödjer SQL92 så som det är implementerat i SQLITE.

Det hela bygger på att använda range index. Enkelt sett så kan man se ett range index som två kolumner, en med dokument id och en med värdet. Genom att kombinera dessa så får man tabeller.

I min tidigare post så  skapade jag ett antal range index som vi nu kan exponera via ODBC. Dock så räcker det inte bara med index utan vi måste också definiera en vy, vilket är det som syns via ODBC, och också skapa en ODBC server.

Inget av detta är vidare komplicerat utan görs enkelt och snabbt.

Innan vi skapar vår vy så behöver vi bestämma huruvida vi skall använda samma schemadatabas eller en enskild. Schemadatabasen används bland annat för att lagra vy definitioner men också de scheman som vi använder för våra dokument, i de fall vi vill använda oss av definierade scheman för vårt data.

Rekommendation är att använda olika schemadatabaser till dokumentdatabaser.

Enklast skapar man en schemadatabas genom att gå in i administrationsgränssnittet, klicka på Databases -> Create samt ge den ett namn, i mitt fall kallar jag den för nobelprize-schemas och sedan klickar på Ok.

Skapa schemadatabas

Vi behöver också sätt upp minst ett forrest för vår databas. Detta görs genom att klicka på länken Database->Forrest och sedan Create a Forest. Ge den ett namn, tex nobelprize-schema-001, och klicka på Ok. Sedan skall vi bara koppla ihop databasen med vår nya forrest. Snabbast görs detta genom att klicka på Summary, välja nobelprize-schemas i den tomma boxen bredvid nobelprize-schema-001 och klicka på Ok, som är längst ner på sidan.

Koppla forrest

Nu är vi nästan i mål, men innan dess skall vi ändra så att nobelprize databasen använder vår nya schema databas. Vilket vi gör genom att under Databases klicka på nobelprize, ändra till nobelprize-schemas vid schema database och sedan klicka Ok. Färdigt!

Koppla schema till databas

 

Låt oss nu skapa vår vy. Det gör vi i Query Console, som öppnas i webbläsaren på http://localhost:8000/qconsole/ (eller den IP-adress som din MarkLogic server är installerad på).

Först behöver vi ett schema, på samma sätt som relationsdatabasen. Nedan kod skapar ett schema som heter main. Tänk på att välja nobelprize databasen innan du kör koden.

import module namespace view = "http://marklogic.com/xdmp/view" at "/MarkLogic/views.xqy";

view:schema-create("main", ())

När det är färdigt så får du ett nummer tillbaka som är id’t på schemat. Detta behöver du inte hålla reda på.

Nästa steg är att skapa vår vy. Vyn är som sagt det som vi kommer att se via ODBC/SQL, vi behöver minimum definiera en eller flera kolumner. En kolumn kan vara något som syns och kan filtreras på eller bara vara tillgänglig för filtrering.  Alla kolumner som syns måste vara range index med undantag för uri, identifieraren av ett dokument, och collections, samlingar. Dock för dessa så måste man ha tillåtit att MarkLogic server tillhandahåller ett lexikon för dem, vilket det är standard för URI.

Nedan kod kommer att skapa en vy som heter winners_organization och som innehåller sex kolumner som man kan visa och filtera på. Kör koden efter du verifierat att du använder nobelprize databasen.

import module namespace view = "http://marklogic.com/xdmp/view" at "/MarkLogic/views.xqy";
view:create(
"main",
"winners_organization",(),
( 
  view:column("uri", cts:uri-reference()),
  view:column("org_name", cts:element-reference(fn:QName("http://marklogic.com/swe/nobel-prize","name"))),
  view:column("year", cts:element-reference(fn:QName("http://marklogic.com/swe/nobel-prize","year"))),
  view:column("city", cts:element-reference(fn:QName("http://marklogic.com/swe/nobel-prize","city"))),
  view:column("country", cts:element-reference(fn:QName("http://marklogic.com/swe/nobel-prize","country"))),
  view:column("category", cts:element-reference(fn:QName("http://marklogic.com/swe/nobel-prize","category")))
),
(),
())

Om allt går som det skall så får du ett nummer som resultat.

Vi kan nu testa vår vy genom att skriva SQL mot den. Detta kan göras i Query Console genom att öppna en ny flik och välja SQL som Query Type

Om vi skriver nedan SQL och kör så skall vi nu få ett resultat.

SELECT  * FROM winners_organization

SQL mot vy

Eftersom SQLITE SQL är rätt begränsad i vad den stödjer för typ av analytiska funktioner så är det möjligt att använda sig av många de funktioner som finns implementerade i XQuery. Följande SQL listar alla tillgängliga funktioner.

DESCRIBE all functions

Vill man specifikt se aggregerande funktioner så skriver man

DESCRIBE aggregate functions

Och liknande för andra funktioner.

DESCRIBE scalar functions

För att vi skall kunna använda ett analysverktyg via ODBC så behöver vi som sista punkt skapa en ODBC server.

Detta görs via administrationsgränssnittet. Väl där så klickar man på Groups->Default->App Servers och sedan Create ODBC.

Vi behöver ge den ett namn, nobelprize-odbc, root, /, port, 8042 (verifiera först att denna är ledig, man kan se det på summary filken) och välja nobelprize som database. Sedan är det bara att klicka Ok.

ODBC server

Innan vårt analysverktyg, R i detta fall, kan använda ODBC så behöver vi installera och konfigurera ODBC drivrutinen på vår klient. ODBC drivrutin för MarkLogic kan laddas hem från http://developer.marklogic.com/products/odbc.

När klienten är installerad så är det bara att skapa en ny datakälla som pekar på nobelprize databasen. Nedan är för Windows, ip-adressen är där MarkLogic server är installerad och port är den som du angav när du skapade ODBC serven.

ODBC Klient

Nu äntligen är vi redo för att använda vårt analysverktyg. Jag kommer att använda R och RStudio som editor. Hur du installerar dessa finns det massor av instruktioner på nätet, Google är din vän.

För att kunna använda ODBC med R så behöver du använda ett R paket som heter RODBC. När det väl är där så kopplar du upp dig med följande kod.

library(RODBC)
# connect to the MarkLogic ODBC server with the default credentials (set in ODBC settings)
ch <- odbcConnect("MarkLogicSQL")

ch objektet innehåller nu en koppling. För att lista alla vyer som är tillgängliga så skriver vi följande kod.

# List all tables(views)
sqlTables(ch)

Att hämta data görs via en SQL, följande hämtar alla rader som har Country = Sweden och sedan listar de sex första raderna.

# simple select
sql <- "select * from winners_organization where country = 'Sweden'"
df <- sqlQuery(ch, sql)
# show first six rows
head(df)

I och med att MarkLogic server har stark sökfunktionalitet så skulle det vara bra om det gick att dra nytta av via SQL också. Och det går det.

Det finns ett tillägg i den SQL som är implementerad i MarkLogic server som heter MATCH. MATCH gör det möjligt att söka i hela dokumentet, på samma sätt som search:search, se mitt tidigare inlägg för detaljer.

Så om jag skulle vilja hitta alla rader där Uppsala förekommer, oavsett kolumn eller fält som finns i dokumenten. Så skriver jag följande.

# more advanced using search functionality, searching in all fields
sql <- "select * from winners_organization where winners_organization MATCH 'uppsala'"
df <- sqlQuery(ch, sql)
df

Vi kan nu notera att det finns tre rader där uppsala inte förekommer i de kolumner som syns. Men det är ett korrekt resultat eftersom ordet förekommer i andra fält. Vi kan verifiera detta genom att gå in i Query Console och köra följande mot vår nobelprize databas.

import module namespace search = "http://marklogic.com/appservices/search"
                         at "/MarkLogic/appservices/search/search.xqy";
 
search:search("uppsala")

Vi kommer då få tillbaka 10 dokument, jämfört mot våra 8 via ODBC. Men även det är korrekt för två av resultaten har inget värde i name fältet, och eftersom det ingår i vår vy och inte är definierad som nullbart så kommer vyn endast visa de dokument som har ett värde i det fältet.

Svårare än så här är det inte att använda ODBC/SQL mot MarkLogic Server. Med hjälp av MATCH funktionen så får man också åtkomst till stark sökfunktionalitet som möjliggör ett mer flexibelt urval av data.

För mer information runt SQL och MarkLogic så rekommenderas SQL Data Modeling Guide.

Med nästa inlägg tänkte jag adressera hur man kan använda REST mot MarkLogic server i R.

/Mats Stellwall

Share on FacebookShare on Google+Email this to someoneTweet about this on TwitterShare on LinkedIn

En reaktion på ”R du redo för analys?

Kommentarer inaktiverade.