PyBabe est un micro framework d'ETL en python. Il permet d'intégrer facilement différents types (csv, excel, zip, ..) et sources de données (filesystem, DB, FTP, HTTP, Amazon S3, Email), d'effectuer des transformations simples sur les données, soit via des primitives ad-hoc, soit via des extensions en python.
Le projet est né dans le cadre d'intégration de logs analytiques d'un éditeur de jeux sociaux. Le volume des logs (30GB par jour), leur diversité (SQL, logs applicatifs, logs apaches, API REST externes etc...) et le besoin de traitement ad-hoc pour contrôler la qualité des données rendait difficile l'utilisation de solutions sur étagère.
Un premier projet utilisant une solution ETL open-source avait été un échéc. Il était clair qu'une solution à la fois souple, agile, simple et efficace dans la manipulation de donnée était nécessaire. L'équipe s'est alors naturellement tournée vers Python !
Un premier développement Python a permis très rapidement d'obtenir des résultats. Cependant pour permettre une meilleur maintenance du code d'intégration, la conception d'un framework a été décidé : ceci a donné naissance à pybabe maintenant open-source.
PyBabe utilise de manière intensive une approche par stream, tirant parti des namedtuple et des générateurs. Il fournit une bibliothèques de primitives riches. Ainsi pour récupérer un fichier de log compressé de s3, détecter le pays, le navigateur, et le pousser dans une base, le script pybabe ressemble à:
## Recupére un fichier CSV de S3, le décompresse, cache en local babe = babe.pull(url=“s3://myapp/mydir 2012-07-07_*.csv.gz”,cache=True)
## Recupère l’IP dans le champs IP, trouve pas geoip le pays babe = babe.geoip_country_code(field=“ip”, country_code=“country”, ignore_error_True)
## Récupère le user agent, et stocke le nom du navigateur babe = babe.user_agent(field=“user_agent”, browser=“browser”)
## Ne garde que les champs pertinents babe = babe.filterFields(fields=[“user_id”, “date”, “country”, “user_agent”])
## Stocke le résultat dans une base de donnée babe.push_sql(database=“mydb”, table=“mytable”, username=“…”);
PyBabe permet également d'effectuer des opérations sur de gros volumes de données, pour effectuer certaines opérations de reporting. Ainsi, pour calculer une somme sur un volume d'utilisateur, augmenter le résultat du nom de l'utilisatuer et fabriquer un fichier excel de résultat:
babe = Babe()
## Recupére un gros fichier csv
babe = babe.pull(filename=“mybigfile.csv”)
## Effecture un tri “disk-based”, par paquet de 100.000 lignes
babe = babe.sortDiskBased(field=“uid”, nsize=100000)
## Calcule un regroupement par uid
## Calcule la somme des revenues par utilisateurs.
babe = babe.groupBy(field=“uid”, reducer=lambda x, y: (x.uid, x.amount + y.amount))
## Join avec le résultat d’une requete sql pour recupérer des meta information sur les utilisateurs
babe = babe.join(Babe().pull_sql(database=“mydb”, table=“user_info”, “uid”, “uid”)
## Stocke le résultat du rapport dans un fichier Excel !!
babe.push (filename=“reports.xlxs”);
Le projet PyBabe ne fait que commencer et espère de nouveaux contributeurs !