Kylin, en tant que MOLAP particulièrement performant, propose un flux complet de création et de mise à jour de cubes. Il offre également une interface de requêtage SQL. D'un point de vue fonctionnel, cela semble satisfaisant, mais la fourniture de servcies de requête peut encore être améliorée en termes d'ergonomie.
Les requêtes SQL nécessitent souvent de joindre des tables Hive. Le cube sert à optimiser les requêtes, mais l'utilisateur doit connaître la structure de la table Hive sous-jacente. Pourquoi ne pas fournir une interface permettant aux utilisateurs d'interroger directement le modèle de cube ?
Par exemple, nous créons un cube « Ventes » dans Kylin pour analyser les données commerciales de l'entreprise. Les dimensions incluent : année/trimestre/jour, ainsi que le site. Les mesures comprennent le montant des ventes, le nombre d'articles vendus, le nombre de vendeurs, etc.
Ce cube nécessite la jointure de deux tables Hive pour obtenir les données brutes.
Nous ne souhaitons pas que l'utilisateur ait à se soucier de la structure sous-jacente des tables Hive, mais plutôt qu'il puisse interroger directement la structure de données du cube.
MDX
Le langage MDX (Multidimensional Expressions) est le langage de requête standard pour l'OLAP. Il interroge des structures de données multidimensionnelles (cubes). Un analyseur comme Mondrian traduit le MDX en SQL pour interroger la base de données relationnelle (parfois en plusieurs requêtes).
Cubes Framework
Fournir une API orientée opérations OLAP serait plus convivial du point de vue de l'appelant. Par exemple, une fois notre modèle de cube de ventes construit, des combinaisons d'opérations telles que drilldown/rollup, slice/dice permettent d'obtenir les résultats statistiques finaux. C'est bien plus pratique qu'avec MDX ou SQL. Le framework Cubes (Python) répond à ce besoin ( https://pythonhosted.org/cubes/index.html ).
En un sens, Cubes est un ORM pour les modèles multidimensionnels.
Kylinpy
Cubes accepte de nombreuses sources de données du moment qu'un dialecte SQLAlchemy est disponible. Kylinpy est le paquet SQLAlchemy pour Kylin. Cependant, pour l'interfacer avec Cubes, une légère modification est nécessaire :
diff --git a/kylinpy/kylindb.py b/kylinpy/kylindb.py
index bd0562e..6d6f7c7 100644
--- a/kylinpy/kylindb.py
+++ b/kylinpy/kylindb.py
@@ -39,6 +39,10 @@ class Cursor(object):
] for c in self._column_metas)
def execute(self, query, *params, **kwargs):
+ for param_set in params:
+ for key, value in param_set.items():
+ query = query.replace('%(' + key + ')s', str(value))
+
Modèle Cubes (model.json)
Voici le fichier de modèle Cubes correspondant au modèle Kylin :
{
"dimensions": [
{
"name":"year",
"levels": [
{
"name":"YEAR",
"label":"Année",
"attributes": ["YEAR_BEG_DT"]
},
{
"name":"QUARTER",
"label":"Trimestre",
"attributes": ["QTR_BEG_DT"]
},
{
"name":"PART_DT",
"label":"Date",
"attributes": ["PART_DT"]
}
]
},
{
"name":"site",
"levels": [
{
"name": "LSTG_SITE_ID",
"label": "Site",
"attributes": ["LSTG_SITE_ID"]
}
]
}
],
"cubes": [
{
"name": "KYLIN_SALES",
"dimensions": ["year", "site"],
"joins": [
{"master":"PART_DT", "detail":"KYLIN_CAL_DT.CAL_DT","method": "match"}
],
"measures": [
{"name": "PRICE", "label": "Prix"},
{"name": "ITEM_COUNT", "label": "Nombre d'articles"},
{"name": "SELLER_ID", "label": "Vendeur", "aggregates":["count_distinct"]}
],
"aggregates": [
{
"name": "TOTAL_SOLD",
"function": "sum",
"measure": "PRICE"
},
{
"name": "TOTAL_ITEMS",
"function": "sum",
"measure": "ITEM_COUNT"
},
{
"name": "_COUNT_",
"function": "count"
},
{
"name": "DISTINCT_SELLERS",
"function": "count_distinct",
"measure": "SELLER_ID"
}
],
"mappings": {
"year.PART_DT": "PART_DT",
"year.YEAR_BEG_DT": "KYLIN_CAL_DT.YEAR_BEG_DT",
"year.QTR_BEG_DT": "KYLIN_CAL_DT.QTR_BEG_DT",
"site.LSTG_SITE_ID": "LSTG_SITE_ID"
},
"info": {
"min_date": "2010-01-01",
"max_date": "2010-12-31"
}
}
]
}
Lancement et utilisation du Slicer
Fichier slicer.ini
[workspace]
log_level: debug
[server]
host: localhost
port: 5000
reload: yes
prettyprint: yes
[store]
type: sql
url: kylin://ADMIN:KYLIN@localhost:7070/Tutorial?version=v1
schema=DEFAULT
dimension_schema=DEFAULT
[models]
main: model.json
Commande de lancement :
slicer serve slicer.ini
Exemplse de requêtes HTTP :
-- Drilldown par trimestre sur l'ensemble des statistiques
http://localhost:5000/cube/KYLIN_SALES/aggregate?drilldown=year:QUARTER
-- Drilldown par année
http://localhost:5000/cube/KYLIN_SALES/aggregate?drilldown=year:YEAR
-- Drilldown par année pour le site 0
http://localhost:5000/cube/KYLIN_SALES/aggregate?drilldown=year:YEAR&cut=site:0
-- Pour les sites 0 à 4, statistiques de chaque trimestre de 2012
http://localhost:5000/cube/KYLIN_SALES/aggregate?drilldown=year.QUARTER|site&cut=year.YEAR_BEG_DT:date'2012-01-01'|site:0-4