Import von csv Dateien in duckdb und R

... zu anderer statistischer Software, zu Datenbanken und Programmiersprachen.

Moderatoren: EDi, jogo

Aaron
Beiträge: 20
Registriert: Di Nov 07, 2023 9:11 am

Import von csv Dateien in duckdb und R

Beitrag von Aaron »

Ich möchte eine große Anzahl von csv-Dateien in duckdb importieren und in R weiterverarbeiten. Als Ausgabe erwarte ich den Tabelleninhalt, der unten in dem Post zu finden ist. Im ersten Schritt möchte ich die Daten TEST-2022 in die Datenbank duckdb laden. Danach möchte ich die Daten (Tabelleninhalt) aus der Datenbank sehen. Nach dem Einlesen der Daten möchte ich z. B . von Spalte Beta den Mittelwert der Spalte berechnen.
Frage 1: Mit `dbWriteTable` wird eine Tabelle aus der Datenbank erstellt. Ist diese Behauptung richtig?

Die csv-Dateien haben das folgende Format:

Code: Alles auswählen

$ file -i 1.csv
1.csv: application/csv; charset=us-ascii
Die Verzeichnisstruktur ist wie folgt:

Code: Alles auswählen

data/
└── TEST
    ├── 2022
    │   ├── 1.csv
    │   ├── 2.csv
    │   └── 3.csv
    └── TEST-2022.csv <- The file TEST-2022.csv are the three csv files in one file.
Mein Code snippet

Code: Alles auswählen

# Add libraries
library(duckdb)
library(dplyr)
library(DBI)

path <- "data/TEST/2022"
setwd(path)


# write to disk as "test-year.duckdb", other defaults to in memory
con <- DBI::dbConnect(duckdb::duckdb(), dbdir = "test-2022.duckdb")
duckdb::duckdb_read_csv(
    conn = con, name = "test_csv", files = "TEST-2022.csv",
    header = TRUE, delim = ",", encoding = "UTF-8"
)

dbDisconnect(con, shutdown = TRUE)

dbWriteTable(con, "test-2022_table", "test-2022")
res <- dbGetQuery(con, 'SELECT * FROM "test-2022"')
print(res)
The error message: test-2022.csv

Code: Alles auswählen

DateTime,Beta,Alpha
01/02/2022 22:03:13.151,0.83987,0.84129
01/02/2022 22:05:03.942,0.83959,0.84143
01/02/2022 22:05:09.121,0.83982,0.84124
01/02/2022 22:05:09.286,0.83978,0.8412
01/02/2022 22:06:04.904,0.83981,0.84123
01/02/2022 22:06:04.909,0.83979,0.84121
01/02/2022 22:06:08.360,0.8398,0.84122
01/02/2022 22:06:51.568,0.8398,0.84111
01/02/2022 22:06:51.573,0.83959,0.841
01/02/2022 22:06:53.234,0.83958,0.841
01/02/2022 22:06:57.617,0.83958,0.84099
01/02/2022 22:06:59.648,0.83957,0.84099
01/02/2022 22:07:00.037,0.83958,0.84099
01/02/2022 22:07:00.378,0.83959,0.84099
01/02/2022 22:07:13.989,0.8396,0.84099
01/02/2022 22:07:14.071,0.83961,0.84099
01/02/2022 22:07:15.506,0.83962,0.84099
01/02/2022 22:07:15.839,0.83962,0.841
01/02/2022 22:07:16.219,0.83963,0.841
01/02/2022 22:07:16.835,0.83962,0.841
01/02/2022 22:07:17.185,0.83963,0.841
01/02/2022 22:07:17.214,0.83963,0.84099
01/02/2022 22:07:17.517,0.83962,0.84099
01/02/2022 22:07:19.701,0.83961,0.84099
01/02/2022 22:07:20.477,0.83962,0.84099
01/02/2022 22:07:21.478,0.83961,0.84099
01/02/2022 22:07:22.340,0.83962,0.84099
01/02/2022 22:07:23.344,0.83961,0.84099
01/02/2022 22:07:27.841,0.83962,0.84099
01/02/2022 22:07:28.589,0.83963,0.84099
01/02/2022 22:07:28.734,0.83964,0.84099
01/02/2022 22:07:29.076,0.83965,0.84099
01/02/2022 22:07:34.188,0.83966,0.84099
01/02/2022 22:07:34.528,0.83967,0.84099
01/02/2022 22:07:34.873,0.83966,0.84099
01/02/2022 22:07:35.969,0.83967,0.84099
01/02/2022 22:07:38.535,0.83968,0.84099
LG,
Aaron
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Import von csv Dateien in duckdb und R

Beitrag von Athomas »

Im ersten Schritt möchte ich die Daten TEST-2022 in die Datenbank duckdb laden.
Wenn ich Dich richtig verstehe (und ein wenig vermute) hast Du eine große Menge gleich strukturierter (?) csv-Dateien, die Du irgendwie in R auswertbar machen möchtest!?

Warum dann der Umweg über eine Datenbank?
Aaron
Beiträge: 20
Registriert: Di Nov 07, 2023 9:11 am

Re: Import von csv Dateien in duckdb und R

Beitrag von Aaron »

Ich habe ca. 200 Datensätze von die 5Gb, die ich unterschiedlich zu jeweils einer Datenbank zusammen führen werde. Dann möchte ich verschiedene Berechnungen ausführen.
LG,
Aaron
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Import von csv Dateien in duckdb und R

Beitrag von Athomas »

Ich habe ca. 200 Datensätze von die 5Gb, die ich unterschiedlich zu jeweils einer Datenbank zusammen führen werde
Ich weiß nicht, ob wir das Gleiche unter "Datenbank" verstehen!?

Jeweils 5GB oder zusammen 5GB?
Wieviel RAM hast Du (frei)?
Willst Du vorrangig das Handling von Datenbanken üben oder ein konkretes Problem lösen?
Aaron
Beiträge: 20
Registriert: Di Nov 07, 2023 9:11 am

Re: Import von csv Dateien in duckdb und R

Beitrag von Aaron »

Ich will ein konkretes Problem lösen. Mein Post ist so aufgebaut, dass der Quellcode einfach per copy and paste in 'R' eingefügt werden kann, um den Fehler reproduzieren zu können. Es sind 200 CSV Dateien mit einer Größe von jeweils 5GB. Das Ziel ist, die Daten aus der Datenbank in eine Tabelle zu schreiben und mithilfe dieser Tabelle weitere Berechnungen durchführen zu können. Ich möchte z. B. alle Daten aus der Datenbank in 'R' anzeigen lassen. Aus Spalte 2 den Mittelwert berechnen und das Ergebnis in 'R' anzeigen lassen.

Folgende Arbeitsschritte habe ich bis jetzt erledigt.

1. Ich habe die csv Dateien von UTF-16LE nach UTF-8 convertiert. Ein paar Zeilen der CSV-Dateien sind in meinem ersten Post.
2. Die konvertierten CSV-Dateien in die Datenbank geladen. Die Datenbank wird angelegt.
3. Nun möchte ich aus der Datenbank, welche aus 3 Spalten besteht in eine Tabelle schreiben. Soweit ich das verstanden habe, sind die Daten in der Datenbank abgelegt, aber es existiert noch keine Tabelle? Frage: Ist meine Annahme richtig?

Hier der Quellcode:

Code: Alles auswählen

con <- DBI::dbConnect(duckdb::duckdb(), dbdir = "test-2022.duckdb")
duckdb::duckdb_read_csv(
    conn = con, name = "test_csv", files = "TEST-2022.csv",
    header = TRUE, delim = ",", encoding = "UTF-8"
)
Im zweiten Teil möchte ich die Tabelle anlegen und dabei kommt es zu einem Fehler:

Code: Alles auswählen

Loading required package: DBI
Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘dbWriteTable’ for signature ‘"duckdb_connection", "character", "character"’ 
Der Quellcode, der den Fehler erzeugt:

Code: Alles auswählen

dbWriteTable(con, "test-2022_table", "test-2022")
res <- dbGetQuery(con, 'SELECT * FROM "test-2022"')
print(res)
LG,
Aaron
Aaron
Beiträge: 20
Registriert: Di Nov 07, 2023 9:11 am

Re: Import von csv Dateien in duckdb und R

Beitrag von Aaron »

Ich denke, dass die Fragestellung klar ist, nämlich das die Daten nicht richtig in eine Tabelle geschrieben werden, diese bricht mit einer Fehlermeldung ab. Die Frage ist, wie muss der Code berichtigt werden. Wie bekomme ich die Daten in die Tabelle und wie gebe ich diese aus? Ich probiere Duckdb selbst zum ersten Mal aus. Ein Hinweis: Die Daten müssen alle UTF-8 codiert sein.

Zusätzlich zu der dbGetQuery-Korrektur, die ich in diesem Fehler habe, ist vielleicht dieser Ausdruck was das Problem lösen könnte. dbWriteTable(con, "test", yourdataframe). Wie muss youdataframe aussehen?
LG,
Aaron
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Import von csv Dateien in duckdb und R

Beitrag von bigben »

Also ich kenne mich ja nicht besonders mit Datenbanken aus, aber duckdb::duckdb_read_csv scheint direkt in die Datenbank zu schreiben während DBI::dbWriteTable üblicherweise einen Dataframe in eine Datenbank schreibt. Erstellt duckdb_read_csv überhaupt einen Dataframe? Wenn nein, wo soll der herkommen? Bist Du sicher, dass Du mit dbWriteTable nichts machen willst, was schon erledigt ist?

JMTC,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Import von csv Dateien in duckdb und R

Beitrag von bigben »

In https://cran.r-project.org/web/packages ... duckdb.pdf gibt es auf Seite 9 ein Beispiel und da folgt auf duckdb_read_csv gleich ein dbReadTable ohne irgendeinen vorherigen Aufruf von irgendwas mit Write...
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Import von csv Dateien in duckdb und R

Beitrag von Athomas »

Das Handbuch zu "duckdb" sagt:
duckdb_read_csv Reads a CSV file into DuckDB
Description
Directly reads a CSV file into DuckDB, tries to detect and create the correct schema for it. This
usually is much faster than reading the data into R and writing it to DuckDB.
Aaron
Beiträge: 20
Registriert: Di Nov 07, 2023 9:11 am

Re: Import von csv Dateien in duckdb und R

Beitrag von Aaron »

Screiben der CSV Files in duckdb:

Code: Alles auswählen

# Add libraries
library(duckdb)
library(dplyr)
library(DBI)

path <- "data/"
setwd(path)

# Create the database
con <- DBI::dbConnect(duckdb::duckdb(), dbdir = "TEST_2022.duckdb", read_only = FALSE)
duckdb::duckdb_read_csv(
    conn = con, name = "table", files = "TEST-2022.csv",
    header = TRUE, delim = ",", encoding = "UTF-8"
)
Die Datenbank wird angelegt mit dem dbdir = "TEST_2022.duckdb"

Die Frage ist, muss eine Tabelle erstellt werden?
Wie frage ich die Datenbank ab? Wie muss das dataframe aussehen. WIe kann ich alle Spalten und Zeilen sehen? Bitte gebt mir einmal Starthilfe.
LG,
Aaron
Antworten