TSV par CSV dans vos arguments de format.
En suivant ce guide, vous allez :
- Examiner : interroger la structure et le contenu du fichier TSV.
- Déterminer le schéma ClickHouse cible : choisir les types de données appropriés et faire correspondre les données existantes à ces types.
- Créer une table ClickHouse.
- Prétraiter et transmettre en flux les données vers ClickHouse.
- Exécuter quelques requêtes dans ClickHouse.
Prérequis
- Téléchargez le jeu de données en vous rendant sur la page NYPD Complaint Data Current (Year To Date), en cliquant sur le bouton Export, puis en choisissant TSV for Excel.
- Installez ClickHouse server et le client
Remarque sur les commandes décrites dans ce guide
- Certaines commandes servent à interroger les fichiers TSV ; elles s’exécutent dans le terminal.
- Les autres servent à interroger ClickHouse et s’exécutent dans
clickhouse-clientou dans l’UI Play.
Les exemples de ce guide supposent que vous avez enregistré le fichier TSV sous
${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv ; adaptez les commandes si nécessaire.Familiarisez-vous avec le fichier TSV
Examinez les champs du fichier TSV source
Query
clickhouse-local pour interroger les données du fichier TSV que vous avez téléchargé.
Query
Response
Nullable(Float64) et tous les autres champs en Nullable(String). Lorsque vous créez une table ClickHouse pour stocker les données, vous pouvez définir des types plus appropriés et plus performants.
Déterminer le schéma approprié
JURISDICTION_CODE est numérique : doit-il être de type UInt8 ou Enum, ou bien Float64 convient-il ?
Query
Response
JURISDICTION_CODE tient bien dans un UInt8.
De même, examinez certains champs String et voyez s’ils conviendraient mieux comme champs DateTime ou LowCardinality(String).
Par exemple, le champ PARKS_NM est décrit comme “Nom du parc, de l’aire de jeux ou de l’espace vert de NYC où l’événement s’est produit, le cas échéant (les parcs d’État ne sont pas inclus)”. Les noms des parcs de New York peuvent être de bons candidats pour un LowCardinality(String) :
Query
Response
Query
Response
PARK_NM. Ce nombre reste faible au regard de la recommandation LowCardinality, qui préconise de rester en dessous de 10 000 chaînes distinctes dans un champ LowCardinality(String).
Champs DateTime
CMPLNT_FR_DT et CMPLT_TO_DT permet de déterminer si ces champs sont toujours renseignés ou non :
Query
Response
Query
Response
Query
Response
Query
Response
Établir un plan
JURISDICTION_CODEdoit être converti enUInt8.PARKS_NMdoit être converti enLowCardinality(String)CMPLNT_FR_DTetCMPLNT_FR_TMsont toujours renseignés (éventuellement avec une heure par défaut de00:00:00)CMPLNT_TO_DTetCMPLNT_TO_TMpeuvent être vides- Dans les données source, les dates et les heures sont stockées dans des champs distincts
- Les dates sont au format
mm/dd/yyyy - Les heures sont au format
hh:mm:ss - Les dates et les heures peuvent être concaténées en types DateTime
- Certaines dates sont antérieures au 1er janvier 1970, ce qui signifie qu’il nous faut un DateTime sur 64 bits
Il reste de nombreuses autres modifications à apporter aux types, et elles peuvent toutes être déterminées en suivant les mêmes étapes d’analyse. Examinez le nombre de chaînes distinctes dans un champ, les valeurs minimales et maximales des données numériques, puis prenez vos décisions. Le schéma de table présenté plus loin dans le guide contient de nombreuses chaînes à faible cardinalité et des champs d’entiers non signés, et très peu de nombres à virgule flottante.
Concaténer les champs de date et d’heure
CMPLNT_FR_DT et CMPLNT_FR_TM en une seule String pouvant être convertie en DateTime, sélectionnez les deux champs reliés par l’opérateur de concaténation : CMPLNT_FR_DT || ' ' || CMPLNT_FR_TM. Les champs CMPLNT_TO_DT et CMPLNT_TO_TM sont traités de la même manière.
Query
Response
Convertir la chaîne de date et d’heure en type DateTime64
MM/DD/YYYY au format YYYY/MM/DD. Ces deux opérations peuvent être effectuées avec parseDateTime64BestEffort().
Query
DateTime64. Comme l’heure de fin de la réclamation n’est pas garantie, parseDateTime64BestEffortOrNull est utilisé.
Response
Les dates affichées ci-dessus comme
1925 proviennent d’erreurs dans les données. Plusieurs enregistrements des données d’origine comportent des dates des années 1019 à 1022, alors qu’il devrait s’agir de 2019 à 2022. Elles sont stockées sous la forme du 1er janvier 1925, car il s’agit de la date la plus ancienne prise en charge par un DateTime 64 bits.Créer une table
ORDER BY et PRIMARY KEY à utiliser pour la table. Au moins une
des clauses ORDER BY ou PRIMARY KEY doit être spécifiée. Voici quelques recommandations pour choisir les
colonnes à inclure dans ORDER BY. Vous trouverez plus d’informations dans la section Étapes suivantes à la fin
de ce document.
clauses ORDER BY et PRIMARY KEY
- Le tuple
ORDER BYdoit inclure les champs utilisés dans les filtres de requête - Pour maximiser la compression sur disque, le tuple
ORDER BYdoit être ordonné par cardinalité croissante - S’il existe, le tuple
PRIMARY KEYdoit être un sous-ensemble du tupleORDER BY - Si seul
ORDER BYest spécifié, le même tuple sera alors utilisé commePRIMARY KEY - L’index de clé primaire est créé à l’aide du tuple
PRIMARY KEYs’il est spécifié, sinon du tupleORDER BY - L’index
PRIMARY KEYest conservé en mémoire principale
ORDER BY :
Interrogation du fichier TSV pour obtenir la cardinalité des trois colonnes candidates :
Query
Response
ORDER BY devient :
Le tableau ci-dessous utilisera des noms de colonnes plus lisibles ; les noms ci-dessus seront associés à
ORDER BY, on obtient cette structure de table :
Trouver la clé primaire d’une table
system, plus précisément system.table, contient toutes les informations sur la table que vous
venez de créer. Cette requête affiche l’ORDER BY (clé de tri) et la PRIMARY KEY :
Prétraiter et importer des données
clickhouse-local pour prétraiter les données et clickhouse-client pour les importer.
Arguments utilisés par clickhouse-local
Vérifiez les données
Le jeu de données est mis à jour une ou plusieurs fois par an ; vos décomptes peuvent donc ne pas correspondre à ceux indiqués dans ce document.
Query
Response
Query
Response
Exécutez quelques requêtes
Requête 1. Comparer le nombre de plaintes par mois
Query
Response
Requête 2. Comparer le nombre total de plaintes par borough
Query
Response