Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Consolidation BNLC : détecte les erreurs lors du décodage d'un CSV #3586

Merged
merged 10 commits into from
Nov 10, 2023

Conversation

AntoineAugusti
Copy link
Member

@AntoineAugusti AntoineAugusti commented Nov 8, 2023

Traite le problème détaillé ici #3419 (comment)

Certains fichiers CSV peuvent être invalides car mal encodés, le cas vu était la présence d'un " au sein d'un champ sans être échappé.

@AntoineAugusti
Copy link
Member Author

Je suis tombé sur un problème avec csv dans mon premier commit, ça m'a pris du temps de remonter le problème beatrichartz/csv#125

Comment on lines +90 to +94
defp validator_unavailable?(validation_errors) do
validation_errors
|> Enum.filter(&match?({:validator_unavailable_error, _, _}, &1))
|> Enum.any?()
end
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C'est du boy scout ceci et le renommage de :validation_error vers :validator_unavailable_error

@AntoineAugusti AntoineAugusti marked this pull request as ready for review November 8, 2023 08:25
@AntoineAugusti AntoineAugusti requested a review from a team as a code owner November 8, 2023 08:25
@AntoineAugusti
Copy link
Member Author

@AurelienC Avec ce changement tu pourras conserver Châlon dans datasets.csv et ce sera indiqué qu'il y a bien une erreur lors du décodage.

Copy link
Contributor

@vdegove vdegove left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ça me semble bien à part une micro typo dans un commentaire et une question de nommage.

Si je comprends bien, vu ton commentaire sur CSV.decode!, à la base, tu voulais gérer ça directement dans consolidate_resources (la partie append other valid resources) ? Ou pas ? En tout cas ça fait deux passes de décodage de CSV des resources d’origine, une pour vérifier la bonne conformité, l’autre pour append au fichier consolidé, donc ça rajoute un peu de temps de traitement, mais j’imagine que c’est mineur et qu’il n’y a pas de solution en une passe ?

@AntoineAugusti AntoineAugusti force-pushed the consolidate_bnlc_detect_decode_errors branch from 2ad330c to a596594 Compare November 10, 2023 13:45
@AntoineAugusti
Copy link
Member Author

@vdegove Merci pour ta review, j'ai traité tes commentaires !

Si je comprends bien, vu ton commentaire sur CSV.decode!, à la base, tu voulais gérer ça directement dans consolidate_resources (la partie append other valid resources) ?

Non je voulais traiter avant consolidate_resources. Cette fonction prend normalement des choses qui sont conformes et validées et peut ensuite dérouler (lire des fichiers valides, déjà présents sur le disque, bon format etc).

consolidate_resources(download_details)
Logger.info("Sending the email recap")
upload_temporary_file()
|> schedule_deletion()
|> send_email_recap(%{
dataset_errors: dataset_errors,
validation_errors: validation_errors,
download_errors: download_errors
})

En tout cas ça fait deux passes de décodage de CSV des resources d’origine, une pour vérifier la bonne conformité, l’autre pour append au fichier consolidé, donc ça rajoute un peu de temps de traitement, mais j’imagine que c’est mineur et qu’il n’y a pas de solution en une passe ?

En fait ce n'était pas prévu que cette erreur arrive. Aurélien et moi avons été surpris qu'une telle erreur (unescaped double quotes in a value) passe le validateur TableSchema et on a eu un crash inattendu dans CSV.decode! dans consolidate_resources. On a donc cherché à détecter cette erreur potentielle en amont.

Je pense qu'il est possible d'avoir un seul décodage, mais pas sûr que ça vaille le coup du refactor car :

  • CSV.decode est fait en streaming et on veut minimiser l'usage mémoire de manière générale (on aurait pu passer tous les contenus de fichiers en mémoire mais bof)
  • la BNLC va faire < 10k lignes ce qui n'est pas énorme si on doit décoder 2 fois le tout en CSV
  • le temps d'exécution, tant qu'il est inférieur à ~30s est tout à fait acceptable au vu du travail réaliser : consolider un fichier d'une base nationale. Exécution 1 fois par jour en rythme de production, moins actuellement. On est très loin de ce temps actuellement, on est sur du 5s de mémoire

@AntoineAugusti AntoineAugusti added this pull request to the merge queue Nov 10, 2023
Merged via the queue into master with commit 8467cf0 Nov 10, 2023
@AntoineAugusti AntoineAugusti deleted the consolidate_bnlc_detect_decode_errors branch November 10, 2023 16:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants