Moteur SQL distribué en Python à l'aide de Dask

· 5 minutes de lecture
Moteur SQL distribué en Python à l'aide de Dask
SQL + Python

dask-sql est un moteur de requête SQL distribué en Python.
Il vous permet d'interroger et de transformer vos données en utilisant un mélange de
les opérations SQL courantes et le code Python et également augmenter le calcul facilement
si tu en as besoin.

  • Combinez la puissance de Python et SQL : chargez vos données avec Python, transformez-les avec SQL, améliorez-les avec Python et interrogez-les avec SQL - ou l'inverse.
    Avec dask-sql vous pouvez mélanger l'API de dataframe Python bien connue de pandas et Dask avec des opérations SQL courantes, pour
    traiter vos données exactement de la manière qui vous convient le mieux.
  • Infinite Scaling : en utilisant la puissance du grand écosystème « Dask », vos calculs peuvent évoluer selon vos besoins - de votre ordinateur portable à votre super cluster - sans modifier aucune ligne de code SQL. Des k8s aux déploiements cloud, des systèmes batch à YARN - si Dask [le prend en charge] (https://docs.dask.org/en/latest/setup.html), dask-sql le sera aussi.
  • Vos données - vos requêtes : utilisez des fonctions définies par l'utilisateur (UDF) Python dans SQL sans aucun inconvénient de performance et étendez vos requêtes SQL avec le grand nombre de bibliothèques Python, par exemple l'apprentissage automatique, différents formats d'entrée compliqués, des statistiques complexes .
  • Facile à installer et à entretenir : dask-sql n'est qu'une installation pip/conda (ou un docker exécuté si vous préférez). Pas besoin de configurations de cluster compliquées - dask-sql s'exécutera immédiatement sur votre machine et peut être facilement connecté à votre cluster informatique.
  • Utilisez SQL où vous voulez : dask-sql s'intègre à votre bloc-notes jupyter, à votre module Python normal ou peut être utilisé comme serveur SQL autonome à partir de n'importe quel outil de BI. Il s'intègre même nativement avec Apache Hue.

En savoir plus dans la documentation.

dask-sql GIF

Exemple

Pour cet exemple, nous utilisons des données chargées à partir du disque et les interrogeons avec une commande SQL à partir de notre code python.
N'importe quel cadre de données pandas ou dask peut être utilisé en entrée et dask-sql comprend une grande quantité de formats (csv, parquet, json,...) et d'emplacements (s3, hdfs, gcs,...).

import dask.dataframe as dd
from dask_sql import Context

# Create a context to hold the registered tables
c = Context()

# Load the data and register it in the context
# This will give the table a name, that we can use in queries
df = dd.read_csv("...")
c.create_table("my_data", df)

# Now execute a SQL query. The result is again dask dataframe.
result = c.sql("""
    SELECT
        my_data.name,
        SUM(my_data.x)
    FROM
        my_data
    GROUP BY
        my_data.name
""", return_futures=False)

# Show the result
print(result)

Démarrage rapide

Consultez la documentation ou démarrez l'exemple de cahier sur [binder](https://mybinder.org/v2/gh/nils- braun/dask-sql-binder/main?urlpath=lab).

dask-sql est actuellement en cours de développement et ne comprend pas pour l'instant toutes les commandes SQL (mais une grande partie).
Nous recherchons activement des retours, des améliorations et des contributeurs !

Si vous souhaitez utiliser des GPU pour vos requêtes SQL, jetez un œil au projet blazingSQL.

Installation

dask-sql peut être installé via conda (préféré) ou pip - ou dans un environnement de développement.

Avec conda

Créez un nouvel environnement conda ou utilisez votre environnement déjà présent :

conda create -n dask-sql
conda activate dask-sql

Installez le paquet depuis le canal conda-forge :

conda install dask-sql -c conda-forge

Avec pip

dask-sql a besoin de Java pour l'analyse des requêtes SQL.
Assurez-vous d'avoir une installation Java en cours d'exécution avec la version >= 8.

Pour tester si Java est correctement installé et configuré, exécutez

$ java -version
version openjdk "1.8.0_152-release"
Environnement d'exécution OpenJDK (build 1.8.0_152-release-1056-b12)
VM serveur OpenJDK 64 bits (build 25.152-b12, mode mixte)

Après avoir installé Java, vous pouvez installer le package avec

pip install dask-sql

Pour le developpement

Si vous voulez avoir la version la plus récente (non publiée) de dask-sql ou si vous prévoyez de faire du développement sur dask-sql, vous pouvez également installer le paquet à partir des sources.

git clone https://github.com/nils-braun/dask-sql.git

Créez un nouvel environnement conda et installez l'environnement de développement :

conda create -n dask-sql --file conda.txt -c conda-forge

Il n'est pas recommandé d'utiliser pip au lieu de conda pour la configuration de l'environnement.
Si toutefois vous en avez besoin, assurez-vous que Java (jdk >= 8) et maven sont installés et correctement configurés avant de continuer.
Jetez un œil à conda.txt pour le reste de l'environnement de développement.

Après cela, vous pouvez installer le package en mode développement

pip install -e ".[dev]"

Pour compiler les classes Java (au début ou après les modifications), exécutez

python setup.py java

Ce référentiel utilise des hooks pre-commit. Pour les installer, appelez

pré-commit installer

Tester

Vous pouvez lancer les tests (après installation) avec

tests pytest

Serveur SQL

dask-sql est livré avec une petite implémentation de test pour un serveur SQL.
Au lieu de reconstruire un pilote ODBC complet, nous réutilisons le [protocole presto wire] (https://github.com/prestodb/presto/wiki/HTTP-Protocol).
Il ne s'agit - jusqu'à présent - que d'un début de développement et il manque des concepts importants, tels que
authentification.

Vous pouvez tester le serveur sql presto en exécutant (après l'installation)

serveur-dask-sql

ou en utilisant l'image docker créée

docker run --rm -it -p 8080:8080 nbraun/dask-sql

dans un seul terminal. Cela fera tourner un serveur sur le port 8080 (par défaut)
qui ressemble à une base de données presto normale pour n'importe quel client presto.

Vous pouvez tester cela par exemple avec le [client presto] par défaut (https://prestosql.io/docs/current/installation/cli.html) :

presto --server localhost:8080

Vous pouvez maintenant lancer des requêtes SQL simples (car aucune donnée n'est chargée par défaut) :

=> SÉLECTIONNER 1 + 1 ;
 EXPR$0
--------
    2
(1 rangée)

Vous pouvez trouver plus d'informations dans la documentation.

CLI

Vous pouvez également exécuter la CLI dask-sql pour tester rapidement les commandes SQL :

dask-sql --load-test-data --startup

(dask-sql) > SELECT * FROM timeseries LIMIT 10;

Comment ça marche?

À la base, dask-sql fait deux choses :

  • traduire la requête SQL en utilisant Apache Calcite en une algèbre relationnelle, qui est spécifiée comme un arbre d'objets java - similaire à de nombreux autres moteurs SQL (Hive, Flink, .. .)
  • convertir cette description de la requête des objets java en appels API dask (et les exécuter) - renvoyer une trame de données dask.

Pour la première étape, Apache Calcite doit connaître les colonnes et les types de trames de données dask, donc certaines classes Java pour stocker ces informations pour les trames de données dask sont définies dans planner.
Une fois la traduction en algèbre relationnelle terminée (à l'aide de RelationalAlgebraGenerator.getRelationalAlgebra), les méthodes python définies dans dask_sql.physical la transforment en un plan d'exécution physique en convertissant chaque élément de l'algèbre relationnelle un par un.