Dans ce tutoriel, vous allez insérer 28 millions de lignes de données Hacker News dans une table de ClickHouse aux formats CSV et Parquet, puis exécuter quelques requêtes simples pour explorer les données.
CSV
1
Télécharger le fichier CSV
Une version CSV du jeu de données peut être téléchargée depuis notre bucket S3 public ou en exécutant cette commande :Avec ses 4,6 Go et ses 28 M de lignes, le téléchargement de ce fichier compressé devrait prendre de 5 à 10 minutes.
2
Échantillonner les données
clickhouse-local vous permet de traiter rapidement des fichiers locaux sans
avoir à déployer et à configurer le serveur ClickHouse.Avant de stocker des données dans ClickHouse, échantillonnons le fichier à l’aide de clickhouse-local.
Dans la console, exécutez :Query
Response
file vous permet de lire un fichier depuis un disque local en spécifiant uniquement le format CSVWithNames.
Plus important encore, le schéma est automatiquement déduit du contenu du fichier.
Notez également que clickhouse-local est capable de lire le fichier compressé en déduisant le format gzip à partir de l’extension.
Le format Vertical est utilisé pour visualiser plus facilement les données de chaque colonne.3
Charger les données avec l’inférence de schéma
L’outil le plus simple et le plus puissant pour charger des données est Cela crée une table vide à l’aide du schéma inféré à partir des données.
La commande Pour insérer les données dans cette table, utilisez la commande Vous avez inséré 28 millions de lignes dans ClickHouse avec une seule commande !
clickhouse-client : un client natif en ligne de commande doté de nombreuses fonctionnalités.
Pour charger les données, vous pouvez de nouveau recourir à l’inférence de schéma et laisser ClickHouse déterminer les types des colonnes.Exécutez la commande suivante pour créer une table et insérer directement les données depuis le fichier CSV distant, en accédant à son contenu via la fonction url.
Le schéma est automatiquement inféré :DESCRIBE TABLE permet de voir les types ainsi attribués.Query
Response
INSERT INTO, SELECT.
Avec la fonction url, les données seront lues directement depuis l’URL :4
Explorer les données
Obtenez un échantillon des articles Hacker News et de certaines colonnes en exécutant la requête suivante :Bien que l’inférence de schéma soit un excellent outil pour l’exploration initiale des données, elle relève d’une approche « best effort » et ne remplace pas, à long terme, la définition d’un schéma optimal pour vos données.
Query
Response
5
Définir un schéma
Une optimisation simple et immédiate consiste à définir un type pour chaque champ.
En plus de déclarer le champ temporel au format Avec un schéma optimisé, vous pouvez maintenant insérer les données depuis le système de fichiers local.
Toujours avec
DateTime, nous définissons un type approprié pour chacun des champs ci-dessous après avoir supprimé notre jeu de données existant.
Dans ClickHouse, la clé primaire des données est définie par la clause ORDER BY.Choisir des types appropriés et les colonnes à inclure dans la clause ORDER BY
contribue à améliorer la vitesse des requêtes et la compression.Exécutez la requête ci-dessous pour supprimer l’ancien schéma et créer le schéma amélioré :Query
clickhouse-client, insérez les données du fichier à l’aide de la clause INFILE avec un INSERT INTO explicite.Query
6
Exécuter des exemples de requêtes
Quelques exemples de requêtes sont présentés ci-dessous pour vous aider à
rédiger vos propres requêtes.ClickHouse génère-t-il davantage de bruit au fil du temps ? C’est ici qu’apparaît l’intérêt de définir le champ Il semblerait que “ClickHouse” gagne en popularité au fil du temps.
Quelle est la place de « ClickHouse » comme sujet sur Hacker News ?
Le champ score fournit une métrique de popularité pour les articles, tandis que le champid et l’opérateur de concaténation || peuvent être utilisés pour générer un lien vers le post original.Query
Response
time
en tant que DateTime : l’utilisation d’un type de données approprié permet de recourir à la fonction toYYYYMM() :Query
Response
Qui sont les commentateurs les plus actifs sur les articles liés à ClickHouse ?
Query
Response
Quels commentaires suscitent le plus d’intérêt ?
Query
Response
Parquet
1
Insérer les données
Exécutez la query suivante pour lire à nouveau les mêmes données au format Parquet à l’aide de la fonction Exécutez la commande suivante pour afficher le schéma inféré :Les étapes suivantes utilisent des noms de colonnes plus explicites, tels que
url afin de lire les données distantes :Clés nulles avec ParquetLe schéma inféré rend les colonnes
Nullable ; allow_nullable_key est donc obligatoire, même si ce jeu de données ne contient
aucun ID nul.Query
Response
author et comment. Continuez donc avec un schéma spécifié manuellement.
Supprimez d’abord la table inférée, puis créez-la et insérez les données directement depuis le bucket S3 public :2
Ajoutez un index textuel pour accélérer les recherches
Pour savoir combien de commentaires mentionnent “ClickHouse”, exécutez la requête suivante :Ensuite, créez un index de texte sur la colonne La matérialisation construit l’index pour les données existantes. Le paramètre Le résultat reste le même, car l’index modifie la façon dont ClickHouse trouve les lignes correspondantes, et non les lignes qui correspondent. La
requête indexée traite nettement moins de données et s’exécute beaucoup plus rapidement.
Utilisez L’entrée Utilisez
Query
Response
comment
afin d’accélérer cette requête. Un index de texte utilise un index inversé qui associe les jetons aux lignes qui les contiennent.
Le tokeniseur splitByNonAlpha découpe le texte selon les caractères non alphanumériques. L’index et les requêtes utilisent lower(comment)
avec des termes de recherche en minuscules afin que la correspondance soit insensible à la casse. L’expression de la requête doit correspondre à l’expression indexée.Exécutez les commandes suivantes pour créer l’index :mutations_sync attend la fin de la matérialisation.
Vous pouvez consulter la définition de l’index dans la table system.data_skipping_indices.Exécutez à nouveau la même requête une fois l’index matérialisé :Query
Response
EXPLAIN pour confirmer que ClickHouse prévoit d’utiliser l’index :Query
Response
comment_idx indique que ClickHouse prévoit d’utiliser l’index de texte. Dans cet exemple, le plan sélectionne 547 granules sur 3 527,
réduisant considérablement la quantité de données examinées.Vous pouvez également rechercher n’importe lequel ou l’ensemble de plusieurs tokens. Ces fonctions correspondent à des tokens complets produits par le tokenizer de l’index.
Utilisez hasAnyTokens lorsqu’au moins un token doit correspondre :Query
Response
hasAllTokens lorsque tous les tokens doivent correspondre, quel que soit leur ordre :Query
Response