Interroger CSV directement avec DuckDB
Vous avez été chargé de l'une des tâches suivantes :
— charger un nouveau fichier CSV dans BigQuery pour analyse
— ajouter un nouveau fichier à votre pipeline de données
— effectuer quelques contrôles légers de la qualité des données sur un dépôt de fichier de fournisseur
Vous recherchez l'outillage le plus proche et le plus familier que vous connaissiez. Habituellement, c'est pour tout charger dans Excel, n'est-ce pas ? Ce qui vous fait avancer. Mais le fichier fait 600 Mo et plus de 1,2 million de lignes. Excel vous indique qu'il ne peut charger le fichier que partiellement.
Ok, et ensuite ?
Vous êtes peut-être sur GCP/BigQuery, donc vous faites le clicky-and-droppy mais BQ vous dit que la position 1023845 n'est pas bonne. Comment trouvez-vous même cette position d'octet dans un fichier? <soupir>
Vous recherchez Stackoverflow, et ils vous disent d'utiliser des pandas. Cela vous mène jusqu'au bout, mais votre vitesse est entravée parce que vous avez oublié toutes les commandes. Vous utilisez peut-être ChatGPT, mais vous avez besoin de réponses tout de suite, et vous en avez besoin rapidement.
Ne serait-il pas cool de simplement `select * from output.csv` ?
Eh bien, vous pouvez tout à fait.
Étape 1
brew install duckdb
> duckdb
D> select * from ‘output.csv*’
Vous pouvez même faire `data/*.csv`, ou même d'autres extensions comme `data/*.parquet`.
Dépannage
Donc, le chargement csv ne va pas si bien. Vous avez commencé avec duckdb, il dit
Error: Invalid Input Error: Could not convert string ‘Column_1’ to INT32
in column “Column_1”, at line 100002.
La première chose que nous devrions faire est de créer une vue au-dessus de votre csv avec des numéros de ligne afin que vous puissiez commencer à vérifier le fichier et à effectuer des contrôles de qualité légers.
create sequence seq_id start 1;
D> create or replace view test_1 as SELECT nextval(‘seq_id’) as seq_id, *
from read_csv(‘output.csv’, ALL_VARCHAR=1, AUTO_DETECT=TRUE);
couple of things here, of reference is https://duckdb.org/docs/data/csv
- Vous avez de mauvaises données. Duckdb échantillonne toutes les 100 lignes et devine le type de colonne. Certaines données de votre colonne ne sont pas ce qu'elles sont censées être. `ALL_VARCHAR` vous permet de tout charger, quel que soit le type d'analyse
- `AUTO_DETECT` signifie utiliser la première ligne, devinez combien de colonnes doivent exister. Sinon, nous devrions les saisir manuellement, `columns={'Column_1,', 'Column_2…}'`
À ce stade, puisque notre séquence compte toujours, c'est le bon moment pour la verrouiller et matérialiser la vue avec nos numéros de ligne.
create table test_1_mv as (select * from test_1);
— it seems that line numbers in errors are zero-indexed
— however you cannot start a sequence from 0
— so we need to subtract `1` from the id
select * from test_1 where seq_id = 100001
┌────────┬───────────────┬──────────────┬──┐
│ seq_id │ Column_1 │ Column_2 │ │
│ int64 │ varchar │ varchar │ │
├────────┼───────────────┼──────────────┼──┤
│ 100001 │ Column_1_text │ Column_2_text│ │
├────────┴───────────────┴──────────────┴──┤
│ 1 rows │
└──────────────────────────────────────────┘
Trouvons toutes les lignes incriminées. Ma première pensée est de rechercher toutes les lignes contenant `Column_1_text`.
select * from test_1 where column_1 = ‘Column_1_text’;
select * from test_1
where regexp_matches(Column_1, ‘[a-zA-Z]’)
delete from test_1_mv where seq_id in (select seq_id from test_1_mv
where regexp_matches(Column_1, ‘[a-zA-Z]’));
Écrire le nouveau fichier — Exporter
Pour exporter les données d'une table vers un fichier CSV, utilisez l'instruction "COPY".
COPY test_1_mv TO ‘output_cleaned.csv’ (HEADER, DELIMITER ‘,’);
![Qu'est-ce qu'une liste liée, de toute façon? [Partie 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































