From d19b999d8fde8a29dc369bf44cfe9e1eb9c7a794 Mon Sep 17 00:00:00 2001 From: JulienBlasco Date: Mon, 27 May 2024 20:23:03 +0000 Subject: [PATCH 1/7] Comparaison cas d'usage arrow et duckdb --- 03_Fiches_thematiques/Fiche_duckdb.qmd | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/03_Fiches_thematiques/Fiche_duckdb.qmd b/03_Fiches_thematiques/Fiche_duckdb.qmd index 07927e5d..3af7e1f9 100644 --- a/03_Fiches_thematiques/Fiche_duckdb.qmd +++ b/03_Fiches_thematiques/Fiche_duckdb.qmd @@ -72,6 +72,22 @@ Du point de vue d'un statisticien utilisant `R`, le *package* `duckdb` permet de - __*Traduction en SQL*__: `duckdb` traduit automatiquement les instructions `dplyr` en requêtes SQL (de la même façon qu'`arrow` traduit ces instructions en code C++). Il arrive toutefois que certaines fonctions de `dplyr` n'aient pas d'équivalent direct en `duckdb` et ne puissent être traduites automatiquement. Dans ce cas (qui est heureusement moins fréquent qu'avec `arrow`), il faut parfois utiliser une fonction SQL directement ou trouver une solution pour contourner le problème. La @sec-sql donne quelques trucs et astuces dans ce cas. - __Interopérabilité__: `duckdb` est conçu pour être interopérable entre plusieurs langages de programmation tels que `R`, Python, Java, C++, etc. Cela signifie que les données peuvent être échangées entre ces langages sans avoir besoin de convertir les données, d'où des gains importants de temps et de performance. +## Quand utiliser `duckdb` plutôt que `arrow` ? + +Les **packages** `duckdb` et `arrow` ont des cas d'usage très similaires (voir la fiche [Manipuler des données avec `arrow`](#arrow)), mais on peut préférer l'un à l'autre selon les cas. On peut également les utiliser ensemble pour profiter de chacun de leurs avantages. Le tableau ci-dessous compare quelques cas d'usage de ces deux **packages** : + +| Je souhaite... | arrow | duckdb | +| ------------------------------------------------------------------------- | ----- | ------ | +| Optimiser mes traitements pour des données volumineuses | ✔️ | ✔️ | +| Travailler sur un fichier .parquet sans le charger entièrement en mémoire | ✔️ | ✔️ | +| Travailler sur un fichier .csv️ sans le charger entièrement en mémoire | ❌ | ✔️ | +| Utiliser la syntaxe `dplyr` pour traiter mes données | ✔️ | ✔️ | +| Utiliser du langage SQL pour traiter mes données | ❌ | ✔️ | +| Utiliser des fonctions statistiques qui n'existent pas dans arrow | ❌ | ✔️ | +| Écrire un fichier .parquet | ✔️ | ❌ | +| Modifier des valeurs dans ma table sans la réécrire en entier | ❌ | ✔️ | + + ## Installation de `duckdb` Il suffit d'installer le _package_ `duckdb`, qui contient à la fois `DuckDB` et une interface pour que `R` puisse s'y connecter. From 0909af3520d4b74fca5d04a8090e8debad5ea29d Mon Sep 17 00:00:00 2001 From: JulienBlasco Date: Mon, 27 May 2024 20:35:15 +0000 Subject: [PATCH 2/7] Modification du niveau de titre --- 03_Fiches_thematiques/Fiche_duckdb.qmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/03_Fiches_thematiques/Fiche_duckdb.qmd b/03_Fiches_thematiques/Fiche_duckdb.qmd index 3af7e1f9..a946304a 100644 --- a/03_Fiches_thematiques/Fiche_duckdb.qmd +++ b/03_Fiches_thematiques/Fiche_duckdb.qmd @@ -72,7 +72,7 @@ Du point de vue d'un statisticien utilisant `R`, le *package* `duckdb` permet de - __*Traduction en SQL*__: `duckdb` traduit automatiquement les instructions `dplyr` en requêtes SQL (de la même façon qu'`arrow` traduit ces instructions en code C++). Il arrive toutefois que certaines fonctions de `dplyr` n'aient pas d'équivalent direct en `duckdb` et ne puissent être traduites automatiquement. Dans ce cas (qui est heureusement moins fréquent qu'avec `arrow`), il faut parfois utiliser une fonction SQL directement ou trouver une solution pour contourner le problème. La @sec-sql donne quelques trucs et astuces dans ce cas. - __Interopérabilité__: `duckdb` est conçu pour être interopérable entre plusieurs langages de programmation tels que `R`, Python, Java, C++, etc. Cela signifie que les données peuvent être échangées entre ces langages sans avoir besoin de convertir les données, d'où des gains importants de temps et de performance. -## Quand utiliser `duckdb` plutôt que `arrow` ? +### Quand utiliser `duckdb` plutôt que `arrow` ? Les **packages** `duckdb` et `arrow` ont des cas d'usage très similaires (voir la fiche [Manipuler des données avec `arrow`](#arrow)), mais on peut préférer l'un à l'autre selon les cas. On peut également les utiliser ensemble pour profiter de chacun de leurs avantages. Le tableau ci-dessous compare quelques cas d'usage de ces deux **packages** : From 9dc596524c40fd6dd7859f331c5163eda2d86466 Mon Sep 17 00:00:00 2001 From: JulienBlasco Date: Tue, 4 Jun 2024 12:28:07 +0000 Subject: [PATCH 3/7] =?UTF-8?q?Fiche=20duckdb=20:=20suppresion=20de=20la?= =?UTF-8?q?=20r=C3=A9f=C3=A9rence=20=C3=A0=20la=20mutabilit=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Suppression de la --- 03_Fiches_thematiques/Fiche_duckdb.qmd | 1 - 1 file changed, 1 deletion(-) diff --git a/03_Fiches_thematiques/Fiche_duckdb.qmd b/03_Fiches_thematiques/Fiche_duckdb.qmd index a946304a..a54f9db3 100644 --- a/03_Fiches_thematiques/Fiche_duckdb.qmd +++ b/03_Fiches_thematiques/Fiche_duckdb.qmd @@ -85,7 +85,6 @@ Les **packages** `duckdb` et `arrow` ont des cas d'usage très similaires (voir | Utiliser du langage SQL pour traiter mes données | ❌ | ✔️ | | Utiliser des fonctions statistiques qui n'existent pas dans arrow | ❌ | ✔️ | | Écrire un fichier .parquet | ✔️ | ❌ | -| Modifier des valeurs dans ma table sans la réécrire en entier | ❌ | ✔️ | ## Installation de `duckdb` From b145b18049f2d52b2537c05fd8c9b8c483d9c620 Mon Sep 17 00:00:00 2001 From: Julien Blasco Date: Thu, 6 Jun 2024 08:29:20 +0000 Subject: [PATCH 4/7] =?UTF-8?q?Ajout=20r=C3=A9f=C3=A9rence=20=C3=A0=20la?= =?UTF-8?q?=20section=20arrow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 03_Fiches_thematiques/Fiche_duckdb.qmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/03_Fiches_thematiques/Fiche_duckdb.qmd b/03_Fiches_thematiques/Fiche_duckdb.qmd index a54f9db3..29223d9c 100644 --- a/03_Fiches_thematiques/Fiche_duckdb.qmd +++ b/03_Fiches_thematiques/Fiche_duckdb.qmd @@ -83,8 +83,8 @@ Les **packages** `duckdb` et `arrow` ont des cas d'usage très similaires (voir | Travailler sur un fichier .csv️ sans le charger entièrement en mémoire | ❌ | ✔️ | | Utiliser la syntaxe `dplyr` pour traiter mes données | ✔️ | ✔️ | | Utiliser du langage SQL pour traiter mes données | ❌ | ✔️ | -| Utiliser des fonctions statistiques qui n'existent pas dans arrow | ❌ | ✔️ | | Écrire un fichier .parquet | ✔️ | ❌ | +| Utiliser des fonctions statistiques qui n'existent pas dans arrow (voir @sec-arrow) | ❌ | ✔️ | ## Installation de `duckdb` @@ -744,7 +744,7 @@ f <- function(x) { purrr::walk(f, groups) ``` -## Comparaison avec `arrow` +## Comparaison avec `arrow` {#sec-arrow} `arrow` et `duckdb` partagent de nombreux concepts. Voici quelques différences : From 4c1a6437379029f5e68579f63b4b4ac24fb3d949 Mon Sep 17 00:00:00 2001 From: Julien Blasco Date: Thu, 6 Jun 2024 08:29:40 +0000 Subject: [PATCH 5/7] =?UTF-8?q?Ajout=20mention=20=C3=A9criture=20parquet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 03_Fiches_thematiques/Fiche_duckdb.qmd | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/03_Fiches_thematiques/Fiche_duckdb.qmd b/03_Fiches_thematiques/Fiche_duckdb.qmd index 29223d9c..ef77d65a 100644 --- a/03_Fiches_thematiques/Fiche_duckdb.qmd +++ b/03_Fiches_thematiques/Fiche_duckdb.qmd @@ -83,9 +83,10 @@ Les **packages** `duckdb` et `arrow` ont des cas d'usage très similaires (voir | Travailler sur un fichier .csv️ sans le charger entièrement en mémoire | ❌ | ✔️ | | Utiliser la syntaxe `dplyr` pour traiter mes données | ✔️ | ✔️ | | Utiliser du langage SQL pour traiter mes données | ❌ | ✔️ | -| Écrire un fichier .parquet | ✔️ | ❌ | | Utiliser des fonctions statistiques qui n'existent pas dans arrow (voir @sec-arrow) | ❌ | ✔️ | +| Écrire un fichier .parquet | ✔️ | ✔️ * | +\* pour écrire un fichier .parquet avec le package `duckdb`, il faut utiliser une instruction SQL (voir @sec-ecrire-parquet) ## Installation de `duckdb` @@ -595,7 +596,7 @@ resultats <- dbGetQuery(conn_ddb, "SELECT * FROM data1_nettoye LEFT JOIN data2_n Et vous pouvez bien sûr créer des tables intermédiaires (temporaires ou non) à la place des vues (en utilisant `CREATE TABLE` pluôt que `CREATE VIEW`) pour éviter de les recalculer à chaque fois. -#### Écrire des fichiers +#### Écrire des fichiers {#sec-ecrire-parquet} Vous pouvez exporter des données vers des fichiers en utilisant [`COPY ... TO ...`](https://duckdb.org/docs/sql/statements/copy.html#copy--to) : From 533f4b4493f8eb4b3d76da719921435d7b705132 Mon Sep 17 00:00:00 2001 From: JulienBlasco Date: Thu, 6 Jun 2024 12:11:35 +0000 Subject: [PATCH 6/7] Fiche_duckdb.qmd : correction import CSV MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La fonction arrow::open_dataset() permet également de traiter des csv sans les charger entièrement en mémoire --- 03_Fiches_thematiques/Fiche_duckdb.qmd | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/03_Fiches_thematiques/Fiche_duckdb.qmd b/03_Fiches_thematiques/Fiche_duckdb.qmd index ef77d65a..5e2f7b43 100644 --- a/03_Fiches_thematiques/Fiche_duckdb.qmd +++ b/03_Fiches_thematiques/Fiche_duckdb.qmd @@ -79,8 +79,7 @@ Les **packages** `duckdb` et `arrow` ont des cas d'usage très similaires (voir | Je souhaite... | arrow | duckdb | | ------------------------------------------------------------------------- | ----- | ------ | | Optimiser mes traitements pour des données volumineuses | ✔️ | ✔️ | -| Travailler sur un fichier .parquet sans le charger entièrement en mémoire | ✔️ | ✔️ | -| Travailler sur un fichier .csv️ sans le charger entièrement en mémoire | ❌ | ✔️ | +| Travailler sur un fichier .parquet ou .csv sans le charger entièrement en mémoire | ✔️ | ✔️ | | Utiliser la syntaxe `dplyr` pour traiter mes données | ✔️ | ✔️ | | Utiliser du langage SQL pour traiter mes données | ❌ | ✔️ | | Utiliser des fonctions statistiques qui n'existent pas dans arrow (voir @sec-arrow) | ❌ | ✔️ | From 0a5748cd9f2725d2fd2912c67883105fa9f616da Mon Sep 17 00:00:00 2001 From: JulienBlasco Date: Sat, 22 Jun 2024 15:34:54 +0000 Subject: [PATCH 7/7] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - typographie - ajout fonctionnalités "joindre des tables volumineuses" et "utiliser des fonctions fenêtre" Co-authored-by: Olivier Meslin <44379737+oliviermeslin@users.noreply.github.com> --- 03_Fiches_thematiques/Fiche_duckdb.qmd | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/03_Fiches_thematiques/Fiche_duckdb.qmd b/03_Fiches_thematiques/Fiche_duckdb.qmd index 5e2f7b43..de06d7c2 100644 --- a/03_Fiches_thematiques/Fiche_duckdb.qmd +++ b/03_Fiches_thematiques/Fiche_duckdb.qmd @@ -74,7 +74,7 @@ Du point de vue d'un statisticien utilisant `R`, le *package* `duckdb` permet de ### Quand utiliser `duckdb` plutôt que `arrow` ? -Les **packages** `duckdb` et `arrow` ont des cas d'usage très similaires (voir la fiche [Manipuler des données avec `arrow`](#arrow)), mais on peut préférer l'un à l'autre selon les cas. On peut également les utiliser ensemble pour profiter de chacun de leurs avantages. Le tableau ci-dessous compare quelques cas d'usage de ces deux **packages** : +Les *packages* `duckdb` et `arrow` ont des cas d'usage très similaires (voir la fiche [Manipuler des données avec `arrow`](#arrow)), mais on peut préférer l'un à l'autre selon les cas. On peut également les utiliser ensemble pour profiter de chacun de leurs avantages. Le tableau ci-dessous compare quelques cas d'usage de ces deux *packages* : | Je souhaite... | arrow | duckdb | | ------------------------------------------------------------------------- | ----- | ------ | @@ -82,6 +82,8 @@ Les **packages** `duckdb` et `arrow` ont des cas d'usage très similaires (voir | Travailler sur un fichier .parquet ou .csv sans le charger entièrement en mémoire | ✔️ | ✔️ | | Utiliser la syntaxe `dplyr` pour traiter mes données | ✔️ | ✔️ | | Utiliser du langage SQL pour traiter mes données | ❌ | ✔️ | +| Joindre des tables très volumineuses (plus de 4 Go) | ❌ | ✔️ | +| Utiliser des fonctions fenêtres (voir @sec-arrow) | ❌ | ✔️ | | Utiliser des fonctions statistiques qui n'existent pas dans arrow (voir @sec-arrow) | ❌ | ✔️ | | Écrire un fichier .parquet | ✔️ | ✔️ * |