Skip to main content
Ce connecteur exploite des optimisations spécifiques à ClickHouse, telles que le partitionnement avancé et le pushdown de prédicats, afin d’améliorer les performances des requêtes et la gestion des données. Le connecteur est basé sur le connecteur JDBC officiel de ClickHouse et gère son propre catalogue. Avant Spark 3.0, Spark ne disposait pas d’un concept de catalogue intégré, de sorte que les utilisateurs s’appuyaient généralement sur des systèmes de catalogue externes tels que Hive Metastore ou AWS Glue. Avec ces solutions externes, les utilisateurs devaient enregistrer manuellement les tables de leurs sources de données avant de pouvoir y accéder dans Spark. Cependant, depuis l’introduction du concept de catalogue dans Spark 3.0, Spark peut désormais découvrir automatiquement les tables en enregistrant des plugins de catalogue. Le catalogue par défaut de Spark est spark_catalog, et les tables sont identifiées par {catalog name}.{database}.{table}. Grâce à cette nouvelle fonctionnalité de catalogue, il est désormais possible d’ajouter et d’utiliser plusieurs catalogues dans une même application Spark.

Choisir entre la Catalog API et la TableProvider API

Le ClickHouse Spark connector prend en charge deux modèles d’accès : la Catalog API et la TableProvider API (accès basé sur le format). Comprendre leurs différences vous aidera à choisir l’approche la plus adaptée à votre cas d’usage.

Catalog API vs TableProvider API

Prérequis

  • Java 8 ou 17 (Java 17 ou version ultérieure requis pour Spark 4.0)
  • Scala 2.12 ou 2.13 (Spark 4.0 prend uniquement en charge Scala 2.13)
  • Apache Spark 3.3, 3.4, 3.5 ou 4.0

Matrice de compatibilité

Installation et configuration

Pour intégrer ClickHouse à Spark, plusieurs options d’installation sont possibles afin de s’adapter à différentes configurations de projet. Vous pouvez ajouter le ClickHouse Spark connector comme dépendance directement dans le fichier de build de votre projet (par exemple dans pom.xml pour Maven ou build.sbt pour SBT). Vous pouvez également placer les fichiers JAR nécessaires dans votre dossier $SPARK_HOME/jars/, ou les spécifier directement via une option Spark à l’aide du flag --jars dans la commande spark-submit. Les deux approches garantissent que le connecteur ClickHouse est disponible dans votre environnement Spark.

Importer comme dépendance

Ajoutez le dépôt suivant si vous souhaitez utiliser une version SNAPSHOT.

Télécharger la bibliothèque

Le schéma de nommage du JAR binaire est :
Vous trouverez tous les fichiers JAR publiés dans le Maven Central Repository et tous les fichiers JAR SNAPSHOT générés quotidiennement dans le Sonatype OSS Snapshots Repository.
Il est essentiel d’inclure le JAR clickhouse-jdbc avec le classificateur “all”, car le connecteur s’appuie sur clickhouse-http et clickhouse-client, tous deux inclus dans clickhouse-jdbc:all. Vous pouvez également ajouter le JAR clickhouse-client et clickhouse-http séparément si vous préférez ne pas utiliser le paquet JDBC complet.Dans tous les cas, assurez-vous que les versions des paquets sont compatibles, conformément à la Matrice de compatibilité.

Enregistrer le catalogue (obligatoire)

Pour accéder à vos tables ClickHouse, vous devez configurer un nouveau catalogue Spark avec les configurations suivantes : Ces paramètres peuvent être définis de l’une des façons suivantes :
  • Modifier ou créer spark-defaults.conf.
  • Transmettre la configuration à votre commande spark-submit (ou à vos commandes CLI spark-shell/spark-sql).
  • Ajouter la configuration lors de l’initialisation de votre contexte.
Lorsque vous travaillez avec un cluster ClickHouse, vous devez définir un nom de catalogue unique pour chaque instance. Par exemple :
Vous pourrez ainsi accéder à la table <ck_db>.<ck_table> du catalogue clickhouse1 depuis Spark SQL via clickhouse1.<ck_db>.<ck_table>, et à la table <ck_db>.<ck_table> du catalogue clickhouse2 via clickhouse2.<ck_db>.<ck_table>.

Utilisation de la TableProvider API (accès basé sur le format)

En plus de l’approche basée sur le catalogue, le ClickHouse Spark connector prend en charge un mode d’accès basé sur le format via la TableProvider API.

Exemple de lecture via l’API format

Exemple d’écriture via l’API format

Fonctionnalités de TableProvider

L’API TableProvider offre plusieurs fonctionnalités puissantes :

Création automatique de table

Lors de l’écriture dans une table qui n’existe pas, le connecteur crée automatiquement la table avec un schéma approprié. Il applique automatiquement des valeurs par défaut pertinentes :
  • Engine : utilise MergeTree() par défaut s’il n’est pas spécifié. Vous pouvez définir un autre moteur à l’aide de l’option engine (par exemple, ReplacingMergeTree(), SummingMergeTree(), etc.)
  • ORDER BY : obligatoire — vous devez spécifier explicitement l’option order_by lors de la création d’une nouvelle table. Le connecteur vérifie que toutes les colonnes indiquées existent dans le schéma.
  • Prise en charge des clés Nullable : ajoute automatiquement settings.allow_nullable_key=1 si ORDER BY contient des colonnes Nullable
ORDER BY obligatoire : l’option order_by est obligatoire lors de la création d’une nouvelle table via la TableProvider API. Vous devez spécifier explicitement les colonnes à utiliser dans la clause ORDER BY. Le connecteur vérifie que toutes les colonnes indiquées existent dans le schéma et renverra une erreur si certaines colonnes sont absentes.Sélection du moteur : le moteur par défaut est MergeTree(), mais vous pouvez spécifier n’importe quel moteur de table ClickHouse à l’aide de l’option engine (par exemple, ReplacingMergeTree(), SummingMergeTree(), AggregatingMergeTree(), etc.).

Options de connexion de TableProvider

Lorsque vous utilisez l’API d’accès basé sur le format, les options de connexion suivantes sont disponibles :

Options de connexion

Options de création de table

Ces options sont utilisées lorsque la table n’existe pas encore et doit être créée :
  • L’option order_by est obligatoire lors de la création d’une nouvelle table. Toutes les colonnes indiquées doivent exister dans le schéma. ** Défini automatiquement sur 1 si ORDER BY contient des colonnes Nullable et que cette option n’est pas explicitement fournie.
Bonne pratique : pour ClickHouse Cloud, définissez explicitement settings.allow_nullable_key=1 si les colonnes de votre ORDER BY peuvent être Nullable, car ClickHouse Cloud exige ce paramètre.

Modes d’écriture

Le Spark connector (TableProvider API et Catalog API) prend en charge les modes d’écriture Spark suivants :
  • append : Ajouter des données à une table existante
  • overwrite : Remplacer toutes les données de la table (tronque la table)
Écrasement de partition non pris en charge : Le connector ne prend pas encore en charge les opérations d’écrasement au niveau des partitions (par ex. le mode overwrite avec partitionBy). Cette fonctionnalité est en cours de développement. Consultez l’issue GitHub #34 pour en suivre l’avancement.

Configuration des options ClickHouse

Catalog API et TableProvider API prennent toutes deux en charge la configuration d’options propres à ClickHouse (et non d’options du connecteur). Celles-ci sont transmises à ClickHouse lors de la création de tables ou de l’exécution de requêtes. Les options ClickHouse vous permettent de configurer des paramètres propres à ClickHouse, comme allow_nullable_key, index_granularity et d’autres paramètres au niveau de la table ou de la requête. Elles se distinguent des options du connecteur (comme host, database, table), qui déterminent la façon dont le connecteur se connecte à ClickHouse.

Utilisation de TableProvider API

Avec TableProvider API, utilisez le format d’option settings.<key> :

Utilisation de Catalog API

Avec Catalog API, utilisez le format spark.sql.catalog.<catalog_name>.option.<key> dans votre configuration Spark :
Ou définissez-les au moment de créer des tables via Spark SQL :

Paramètres de ClickHouse Cloud

Lorsque vous vous connectez à ClickHouse Cloud, veillez à activer SSL et à définir le mode SSL adéquat. Par exemple :

Lire les données

Écrire des données

L’écrasement de partitions n’est pas pris en charge : l’API Catalog ne prend pas encore en charge les opérations d’écrasement au niveau des partitions (par ex. le mode overwrite avec partitionBy). Cette fonctionnalité est en cours de développement. Consultez l’issue GitHub n°34 pour en suivre l’avancement.

Opérations DDL

Vous pouvez effectuer des opérations DDL sur votre instance ClickHouse à l’aide de Spark SQL, toutes les modifications étant immédiatement enregistrées dans ClickHouse. Spark SQL vous permet d’écrire des requêtes exactement comme dans ClickHouse, vous pouvez donc exécuter directement des commandes telles que CREATE TABLE, TRUNCATE, entre autres, sans aucune modification, par exemple :
Lors de l’utilisation de Spark SQL, une seule instruction peut être exécutée à la fois.
Les exemples ci-dessus montrent des requêtes Spark SQL, que vous pouvez exécuter dans votre application à l’aide de n’importe quelle API — Java, Scala, PySpark ou le shell.

Travailler avec VariantType

La prise en charge de VariantType est disponible avec Spark 4.0+ et nécessite ClickHouse 25.3+ avec les types JSON/Variant expérimentaux activés.
Le connecteur prend en charge le VariantType de Spark pour manipuler des données semi-structurées. VariantType correspond aux types JSON et Variant de ClickHouse, ce qui vous permet de stocker et d’interroger efficacement des données à schéma souple.
Cette section porte spécifiquement sur la correspondance et l’utilisation de VariantType. Pour un aperçu complet de tous les types de données pris en charge, consultez la section Types de données pris en charge.

Correspondance des types ClickHouse

Lecture des données VariantType

Lors de la lecture depuis ClickHouse, les colonnes JSON et Variant sont automatiquement converties en VariantType de Spark :

Écrire des données de type VariantType

Vous pouvez écrire des données de type VariantType dans ClickHouse à l’aide de types de colonne JSON ou Variant :

Créer des tables VariantType avec Spark SQL

Vous pouvez créer des tables VariantType à l’aide du DDL de Spark SQL :

Configuration des types de Variant

Lors de la création de tables comportant des colonnes VariantType, vous pouvez spécifier les types ClickHouse à utiliser :

Type JSON (par défaut)

Si aucune propriété variant_types n’est spécifiée, la colonne utilise par défaut le type JSON de ClickHouse, qui n’accepte que les objets JSON :
Cela génère la requête ClickHouse suivante :

Type Variant avec plusieurs types

Pour prendre en charge les types primitifs, les tableaux et les objets JSON, indiquez les types dans la propriété variant_types :
Cela génère la requête ClickHouse suivante :

Types pris en charge dans Variant

Les types ClickHouse suivants peuvent être utilisés dans Variant() :
  • Primitives : String, Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64, Bool
  • Tableaux : Array(T), où T est n’importe quel type pris en charge, y compris des tableaux imbriqués
  • JSON : JSON pour stocker des objets JSON

Configuration du format de lecture

Par défaut, les colonnes JSON et Variant sont lues sous forme de VariantType. Vous pouvez modifier ce comportement pour les lire comme des chaînes :

Prise en charge des formats d’écriture

La prise en charge de l’écriture avec VariantType varie selon le format : Configurez le format d’écriture :
Si vous devez écrire dans un type Variant de ClickHouse, utilisez le format JSON. Le format Arrow ne prend en charge l’écriture que dans le type JSON.

Bonnes pratiques

  1. Utilisez le type JSON pour les données exclusivement JSON : si vous stockez uniquement des objets JSON, utilisez le type JSON par défaut (sans la propriété variant_types)
  2. Spécifiez explicitement les types : lorsque vous utilisez Variant(), listez explicitement tous les types que vous prévoyez de stocker
  3. Activez les fonctionnalités expérimentales : assurez-vous que ClickHouse a bien allow_experimental_json_type = 1 activé
  4. Utilisez le format JSON pour les écritures : le format JSON est recommandé pour les données de type VariantType afin d’assurer une meilleure compatibilité
  5. Tenez compte des schémas de requêtes : les types JSON/Variant prennent en charge les requêtes JSON path de ClickHouse pour un filtrage efficace
  6. Indications de colonne pour les performances : lorsque vous utilisez des champs JSON dans ClickHouse, l’ajout d’indications de colonne améliore les performances des requêtes. Actuellement, l’ajout d’indications de colonne via Spark n’est pas pris en charge. Consultez l’issue GitHub #497 pour suivre cette fonctionnalité.

Exemple : workflow complet

Configurations

Voici les configurations paramétrables disponibles dans le connecteur.
Utilisation des configurations : il s’agit d’options de configuration au niveau de Spark qui s’appliquent à la fois à API Catalog et à TableProvider API. Elles peuvent être définies de deux manières :
  1. Configuration Spark globale (s’applique à toutes les opérations) :
  2. Surcharge par opération (TableProvider API uniquement - peut remplacer les paramètres globaux) :
Vous pouvez également les définir dans spark-defaults.conf ou lors de la création de la session Spark.

Types de données pris en charge

Cette section présente la correspondance des types de données entre Spark et ClickHouse. Les tableaux ci-dessous offrent un aperçu rapide des conversions de types de données lors de la lecture de données de ClickHouse dans Spark et de l’insertion de données de Spark dans ClickHouse.

Lecture des données de ClickHouse dans Spark

Insertion de données de Spark dans ClickHouse

Contribution et support

Si vous souhaitez contribuer au projet ou signaler un problème, vos retours sont les bienvenus ! Consultez notre repository GitHub pour ouvrir une issue, proposer des améliorations ou soumettre une pull request. Les contributions sont les bienvenues ! Veuillez consulter les consignes de contribution dans le repository avant de commencer. Merci de nous aider à améliorer notre ClickHouse Spark connector !
Dernière modification le 3 juillet 2026