Passer au contenu principal

Vue d’ensemble

Ce tutoriel suit le [tutoriel ClickHouse], mais exécute toutes ses requêtes via pg_clickhouse.

Démarrer ClickHouse

Commencez par créer une base de données ClickHouse si vous n’en avez pas déjà. Pour démarrer rapidement, vous pouvez utiliser l’image Docker :

Créer une table

Inspirons-nous du [tutoriel ClickHouse] pour créer une base de données simple à partir du jeu de données des taxis de la ville de New York :

Ajouter le jeu de données

Importez ensuite les données :
Vérifiez que nous pouvons l’interroger, puis quittez le client :

Installer pg_clickhouse

Compilez et installez pg_clickhouse depuis PGXN ou GitHub. Vous pouvez aussi démarrer un conteneur Docker à partir de l’[image pg_clickhouse], qui ajoute simplement pg_clickhouse à l’[image Postgres] Docker :

Connecter pg_clickhouse

Connectez-vous maintenant à Postgres :
Puis créez pg_clickhouse :
Créez un foreign server à l’aide du nom d’hôte, du port et du nom de la base de données de votre base ClickHouse.
Ici, nous avons choisi d’utiliser le driver binaire, qui utilise le protocole binaire de ClickHouse. Vous pouvez également utiliser le driver “http”, qui utilise l’interface HTTP. Ensuite, mappez un utilisateur PostgreSQL à un utilisateur ClickHouse. Le moyen le plus simple de procéder consiste à associer l’utilisateur PostgreSQL actuel à un utilisateur distant pour le serveur foreign :
Vous pouvez également spécifier une option password. Ajoutez maintenant la table taxi en important simplement toutes les tables de la base de données ClickHouse distante dans un schéma Postgres :
Et maintenant, la table devrait être importée : dans psql, utilisez \det+ pour l’afficher :
C’est bon ! Utilisez \d pour afficher toutes les colonnes :
Exécutez maintenant une requête sur la table :
Notez la rapidité d’exécution de la requête. pg_clickhouse transmet l’intégralité de la requête, y compris l’agrégat COUNT(), à ClickHouse, de sorte qu’elle s’y exécute et ne renvoie qu’une seule ligne à Postgres. Utilisez EXPLAIN pour le constater :
Notez que “Foreign Scan” apparaît à la racine du plan, ce qui signifie que l’intégralité de la requête a été déléguée à ClickHouse.

Analyser les données

Exécutez quelques requêtes pour analyser les données. Consultez les exemples suivants ou essayez votre propre requête SQL.
  • Calculez le montant moyen des pourboires :
  • Calculez le coût moyen selon le nombre de passagers :
  • Calculez le nombre de prises en charge quotidiennes par quartier :
  • Calculez la durée de chaque trajet en minutes, puis regroupez les résultats par durée du trajet :
  • Affichez le nombre de prises en charge dans chaque quartier, réparti selon l’heure de la journée :
  • Définissez le fuseau horaire d’affichage sur celui de New York et récupérez les trajets vers les aéroports de LaGuardia ou JFK :

Créer un dictionnaire

Créez un dictionnaire associé à une table dans votre service ClickHouse. La table et le dictionnaire sont basés sur un fichier CSV qui contient une ligne pour chaque quartier de New York. Les quartiers sont associés aux noms des cinq boroughs de New York (Bronx, Brooklyn, Manhattan, Queens et Staten Island), ainsi qu’à l’aéroport de Newark (EWR). Voici un extrait du fichier CSV que vous utilisez, présenté sous forme de tableau. La colonne LocationID du fichier correspond aux colonnes pickup_nyct2010_gid et dropoff_nyct2010_gid de votre table des trajets :
  1. Toujours dans Postgres, utilisez la fonction clickhouse_raw_query pour créer un [dictionnaire] ClickHouse nommé taxi_zone_dictionary et le renseigner à partir du fichier CSV stocké dans S3 :
Définir LIFETIME sur 0 désactive les mises à jour automatiques afin d’éviter un trafic inutile vers notre bucket S3. Dans d’autres cas, vous pourriez le configurer autrement. Pour plus de détails, consultez Actualisation des données du dictionnaire avec LIFETIME.
  1. Importez-le maintenant :
  1. Vérifiez que nous pouvons l’interroger :
  1. Excellent. Utilisez maintenant la fonction dictGet pour récupérer le nom d’un borough dans une requête. Cette requête additionne le nombre de trajets en taxi par borough qui se terminent à l’aéroport de LaGuardia ou à JFK :
Cette requête calcule le nombre de trajets en taxi par borough qui se terminent soit à l’aéroport de LaGuardia, soit à l’aéroport JFK. Notez qu’un certain nombre de trajets ont un quartier de prise en charge inconnu.

Effectuer une jointure

Rédigez quelques requêtes qui effectuent une jointure entre taxi_zone_dictionary et votre table trips.
  1. Commencez par un JOIN simple, similaire à la requête précédente sur l’aéroport ci-dessus :
Notez que le résultat de la requête JOIN ci-dessus est identique à celui de la requête dictGet ci-dessus (à l’exception des valeurs Unknown, qui ne sont pas incluses). En coulisses, ClickHouse appelle en réalité la fonction dictGet pour le dictionnaire taxi_zone_dictionary, mais la syntaxe JOIN est plus familière pour les développeurs SQL.
  1. Cette requête renvoie les lignes correspondant aux 1000 trajets avec le montant de pourboire le plus élevé, puis associe chaque ligne au dictionnaire via une jointure interne :
En règle générale, nous évitons d’utiliser SELECT * dans PostgreSQL et ClickHouse. Vous ne devez récupérer que les colonnes dont vous avez réellement besoin.
Dernière modification le 2 juillet 2026