Berechnungen mit Daten aus duckdb

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

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

Berechnungen mit Daten aus duckdb

Beitrag von Aaron »

Ich habe die csv Dateien jetzt in die duckdb importiert. Als nächsten Schritt möchte ich mit diesen Daten einige Berechnungen durchführen. ich möchte aus der Spalte Beta den Höchstwert berechnen. Zunächst müssen die Daten aus der Datenbank, soweit ich richtig verstanden habe, in ein Dataframe überführt werden. Die Berechnung sollte dann mit der Formel max(table$Beta) ausgeführt werden können.

Ich möchte einmal nachfragen, ob ihr mir eine Literaturempfehlung geben könnt, damit ich hier nicht immer die Fragen eines Anfängers stelle.

Die 2. Frage ist, ob überhaupt ein Dataframe gebraucht wird, oder ob die Berechnungen nicht direkt ausgeführt werden können?

Code: Alles auswählen

# 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"
)

# List all tables in the database
table_names <- dbListTables(con)
View(table_names)

# Read the table "table" in the database
database_table <- dbReadTable(con, "table")
View(database_table)
 
# Close database
dbDisconnect(con)
# quit("yes")
Die folgenden Zeilen funktionieren nicht!!

Code: Alles auswählen

# Write table "table" into a dataframe
table.df <- as.data.frame(con, "table")
View(table.df)
LG,
Aaron
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Berechnungen mit Daten aus duckdb

Beitrag von bigben »

Hallo Aaron,
Aaron hat geschrieben: Fr Nov 10, 2023 1:19 pmIch habe die csv Dateien jetzt in die duckdb importiert.
Du kreirst hier eine Reihe von Threads die, wenn sie später jemand findet, voneinander getrennt nicht die vollen Informationen enthalten, die man zum Verständnis braucht und Du beendest auch nie einen Thread mit der Mitteilung, dass und wie das Teilproblem gelöst wurde. Für Menschen, die diese Threads später finden wäre es wirklich gut, wenn Du entweder das Problem nochmal vollständig beschreibst: zum Beispiel ist es für diesen Thread enorm wichtig, dass Du die Daten in eine Datenbank umgelagert hast, weil sie zu groß sind, um in den Arbeitsspeicher Deines Computers zu packen und dass Du Dich dabei für DuckDB als Datenbank entschieden hast. Oder setze mindestens Links zu den Threads die man vorher lesen muss, um diesem zu folgen. Danke.
Zunächst müssen die Daten aus der Datenbank, soweit ich richtig verstanden habe, in ein Dataframe überführt werden.
Ein Dataframe hält alle Daten im Arbeitsspeicher. Den ganzen Aufwand mit DuckDB haben wir doch bisher nur getrieben, weil die Daten zu groß für den Arbeitsspeicher sind. Wenn Sie in einen Dataframe passen würden, wäre es doch viel einfacher gewesen, sie gleich mit read.csv() oder besser mit fread() in einen Dataframe zu lesen?
Die Berechnung sollte dann mit der Formel max(table$Beta) ausgeführt werden können.
Wenn Du Daten hast, die R im Arbeitsspeicher bearbeiten kann, dann ja. Wenn es um die 5x 200GB aus den vorherigen Threads geht, wird das nicht funktionieren. Du musst eine Lösung finden, bei der immer nur soviel in den Arbeitsspeicher gelesen wird, wie hinein passt und das nacheinander immer wieder solange, bis letztlich alle Daten abgearbeitet sind. R ist dafür nicht das richtige Programm, aber R kann richtige Programme dafür fernsteuern. Beispielsweise DuckDB, damit die bisherige Arbeit nicht umsonst war.
DuckDB ist eine SQL-Datenbank und man steuert sie mit SQL Befehlen. Man kann R Befehle nutzen, um SQL-Befehle an die Datenbank weiter zu reichen. Wenn man den R-Dialekt aus dem Paket dplyr kennt, kann man auch die Pakete dbplyr und dplyr benutzen, um DuckDB fernzusteuern, ohne dass man selbst SQL lernen muss. Das ist Geschmackssache. Beispiele für beides gibt es unter https://duckdb.org/docs/api/r.html

Nehmen wir hier mal den Weg über SQL. Um in SQL alles zu sehen, was in der Tabelle tabelle abgelegt ist, schreibt man

SELECT * FROM tabelle;

Um das Maximum der Spalte beta in der Tabelle tabelle zu sehen schreibt man

SELECT max(beta) FROM tabelle;

Um R zu sagen, dass es diese SQL-Anweisung an DuckDB schicken soll schreibt man

dbGetQuery(con, "SELECT max(beta) FROM tabelle;")

Das Ziel muss dabei immer sein, dass dbGetQuery nur solche Daten zurückgibt, die wieder in den Arbeitsspeicher passen. Hier nur den einen Wert, der aktuell gebraucht wird.
Ich möchte einmal nachfragen, ob ihr mir eine Literaturempfehlung geben könnt, damit ich hier nicht immer die Fragen eines Anfängers stelle.
Das ist schwierig, denn es bleibt etwas undurchsichtig, was Deine Vorkenntnisse sind. Du kommst hier mit einer Aufgabenstellung für einen erfahrenen Datenanalysten und wenn Athomas Deine Entscheidung für DuckDB hinterfragt gehst Du darauf gar nicht ein. Zugleich reagierst Du kaum bis gar nicht auf konkrete Code Beispiele, sodass wir nicht wissen, was Du davon verstanden hast und was nicht.

Ein gutes Einführungsbuch über R und ein gutes Einführungsbuch über SQL oder entsprechende online-Angebote und unbedingt die Homepage von DuckDB wären bestimmt nicht verkehrt. Aber so formuliert ist die Antwort unhöflich, weil zu generisch. Wir sind als Forum ein guter Anlaufpunkt für gezielte Fragen zu R. Wenn es darum geht, hunderte von Gigabyte von Daten effizient zu bearbeiten, dann können kleine Details in SQL große Unterschiede machen. Ob wir dafür die richtigen sind, wage ich zu bezweifeln.

Für das Heraussuchen des Maximums von beta bekommst Du aber nochmal ein vollständiges Code-Beispiel:

Code: Alles auswählen

library("duckdb")
bsp <- read.csv(text = "time, 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")


con <- dbConnect(duckdb(), dbdir = ":memory:") 
dbWriteTable(con, "tabelle", bsp)

dbGetQuery(con, "SELECT max(beta), avg(beta), min(beta) FROM tabelle;")

dbDisconnect(con)

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Aaron
Beiträge: 20
Registriert: Di Nov 07, 2023 9:11 am

Re: Berechnungen mit Daten aus duckdb

Beitrag von Aaron »

Hallo Bernhard,

Ich bin gerade erst dabei `R` und duckdb zu erlernen. Die Frage warum duckdb. Ich habe SQLLite und duckdb miteinander verglichen und mich am Ende für duckdb entschieden.

Vielen Dank für Deine Hinweise. Leider bin ich mit dieser Forumssoftware nicht sonderlich vertraut. Wie wird in diesem Forum ein Thread beendet? Ich konnte keinen entsprechenden Schalter, wie z. B. bei GitHub finden.
Du kreierst hier eine Reihe von Threads die, wenn sie später jemand findet, voneinander getrennt nicht die vollen Informationen enthalten, die man zum Verständnis braucht und Du beendest auch nie einen Thread mit der Mitteilung, dass und wie das Teilproblem gelöst wurde.
Ich habe das Internet und YouTube nach einem entsprechenden Beispiel, welches meine Problemstellung ungefähr abbildet, abgesucht. Interessant ist, dass es nicht ein funktionierendes Beispiel gibt, bei dem ich sehen kann, wie der Import, Export und die Weiterverarbeitung aus einer Datenbank in `R` mit z. B. so einem einfachen Problem wie die Berechnung des Höchstwertes gibt.
Ein Dataframe hält alle Daten im Arbeitsspeicher. Den ganzen Aufwand mit DuckDB haben wir doch bisher nur getrieben, weil die Daten zu groß für den Arbeitsspeicher sind. Wenn Sie in einen Dataframe passen würden, wäre es doch viel einfacher gewesen, sie gleich mit read.csv() oder besser mit fread() in einen Dataframe zu lesen?
Zu deinem Beispiel. Vielen Dank dafür. Ich habe mich sehr darüber gefreut. Leider habe ich nicht verstanden, wie ich die Verbindung zu meinen Quellcode entsprechend ergänzen soll. Ich habe folgendes geschrieben:

Code: Alles auswählen

con <- dbConnect(duckdb(), dbdir = "TEST_2022.duckdb")
dbWriteTable(con, "test", table)
dbGetQuery(con, "SELECT max(beta) FROM test;")
Ich sehe in Deinem Beispiel, das du den Datensatz `bsp` einliest, weil Du in deinem Beispiel `dbdir= ":memory:"` gesetzt hast.
Die Tabelle `table` ist schon in der Datenbank vorhanden. Das ist ja die Tabelle, die die Daten enthält. Also wird eine neue Tabelle namens `test` angelegt. Leider ist in meinem Code ein Fehler.
Wenn ich Um R zu sagen, dass es diese SQL-Anweisung an DuckDB schicken soll schreibt man:

Code: Alles auswählen

dbGetQuery(con, "SELECT max(beta) FROM tabelle;")
Vielen Dank für die Hilfe
LG,
Aaron
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Berechnungen mit Daten aus duckdb

Beitrag von bigben »

Aaron hat geschrieben: Fr Nov 10, 2023 3:32 pmWie wird in diesem Forum ein Thread beendet? Ich konnte keinen entsprechenden Schalter, wie z. B. bei GitHub finden.
Das hat nichts mit der Forumssoftware zu tun, sondern ist einfach nur eine Frage der Höflichkeit. Wenn man eine Frage stellt und es wurde einem geholfen, dann kann man doch mal mit einem Danke mitteilen, dass das Problem gelöst ist und wenn einem nicht geholfen wurde, kann man dem vermeintlich helfenden mitteilen, was man noch nicht verstanden hat.
Ich habe folgendes geschrieben:

Code: Alles auswählen

con <- dbConnect(duckdb(), dbdir = "TEST_2022.duckdb")
dbWriteTable(con, "test", table)
dbGetQuery(con, "SELECT max(beta) FROM test;")
Soso. Das hast Du also geschrieben. Und nun? Passiert irgendwas? Am Ende gar eine Fehlermeldung? Nach welchem Kommando? Du schreibst, da sei ein Fehler. Woher weißt Du das? Ich denke mir, dass Du wahrscheinlich keinen Dataframe namens table hast, den Du mitttels dbWriteTable in die Datenbank schreibst. Die Frage, was Du da mit dbWriteTable in die Datenbank schreiben möchtest hatte ich Dir in einem Deiner anderen Threads aber schon gestellt und keine Antwort von Dir bekommen.

Code: Alles auswählen

Ich sehe in Deinem Beispiel, das du den Datensatz `bsp` einliest, weil Du in deinem Beispiel `dbdir= ":memory:"` gesetzt hast.
Ja, die Code-Beispiele die ich Dir schreibe sind vollständig. Du kannst sie in Dein R kopieren und Dich davon überzeugen, dass sie so laufen.
Dafür brauche ich einen Dataframe bsp als Beispiel und ich eröffne die Datenbank in memory weil sie ja nur für dieses Beispiel da ist und ich keine Datei dafür schreiben möchte. Das ist natürlich dann in Deiner Produktivdatenbank anders. Du wolltest Deine Datenbank ja aus dem CSV füllen.

Dein Code ist ohne weitere Daten für uns nicht reproduzierbar, deshalb können wir auch nicht sagen, was da bei Dir nicht funktioniert.
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Aaron
Beiträge: 20
Registriert: Di Nov 07, 2023 9:11 am

Re: Berechnungen mit Daten aus duckdb

Beitrag von Aaron »

Guten Morgen,

vielen Dank für die Ausführungen. Anbei der entsprechende Quellcode, mit der Bitte sich einmal anzusehen, was ich nicht verstanden habe und was euch so verärgert.

Die Fehlermeldung:

Code: Alles auswählen

Error: Parser Error: syntax error at or near "table"
LINE 1: SELECT max(Beta) FROM table;
^
Ich bin für jeden Hinweis dankbar.

Code: Alles auswählen

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

path <- "data/Test/"
setwd(path)

# Read the csv file
raw_data <- read.csv2("TEST-2022.csv", header = TRUE)
# View(raw_data)

# 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"
)

# List all tables in the database
#table_names <- dbListTables(con)
# View(table_names)

# Read the table "table" in the database
#database_table <- dbReadTable(con, "table")
# View(database_table)

# Connect to the database and calculate the maximum value from column Beta
dbGetQuery(con, "SELECT max(Beta) FROM table;")

# Close database
dbDisconnect(con)
# quit("yes")

[attachment=0]TEST-2022.csv[/attachment][attachment=0]TEST-2022.csv[/attachment]
Dateianhänge
TEST-2022.csv
Der Datensatz
(3.95 KiB) 14-mal heruntergeladen
LG,
Aaron
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Berechnungen mit Daten aus duckdb

Beitrag von bigben »

Hallo Aaron,

damit kann man arbeiten. Zu Deinem Code:

Code: Alles auswählen

library(dplyr)
Da Du im weiteren keinerlei Code aus dplyr verwendest ist das hier unnötig und führt nur unnötige Funktionsnamen ein.

Code: Alles auswählen

raw_data <- read.csv2("TEST-2022.csv", header = TRUE)
Weißt Du, was dieser Code machen soll? Hast Du mal getestet, was danach in raw_data steht? Warum hast Du Dich ausgerechnet für die Funktion read.csv2 entschieden? Ich sage Dir jetzt mal, dass read.csv2 für Deine Daten die völlig falsche Funktion ist und dass Du viel lernen kannst bei der Recherche, warum das falsch ist.
Der Fehler spielt im weiteren aber keine Rolle, da die Zeile für den weiteren Ablauf völlig überflüssig ist. raw_data enthält nicht das, was es enthalten soll, aber raw_data wird auch weiter nicht verwendet.

Code: Alles auswählen

Error: Parser Error: syntax error at or near "table"
LINE 1: SELECT max(Beta) FROM table;
Das ist gemein, weil der eigentliche Fehler schon weiter oben passiert ist. Dennoch hilft die Fehlermeldung sehr präzise dabei, das Problem zu lokalisieren. Das Wort "table" ist hier für den PARSER unpassend und wenn man das weiß, kann man darüber nachdenken. Deshalb ist es wichtig, immer genau zu schreiben bei welchem Kommando der Fehler auftritt und die vollständige Fehlermeldung zu posten.

Nun, das hier ist ein typischer Fall für eine Frage im Forum, weil man da nicht drauf kommen muss: "TABLE" ist als Tabellenname leider nicht brauchbar. In der Query erkennt duckdb dass TABLE ein Teil eine SQL Kommandos ist und kommt nicht auf die Idee, dass eine Tabelle genauso heißen könnte wie ein Befehl.
Wenn Du in duckdb_read_csv der Tabelle einen anderen Namen gibst und dann konsequent den anderen Namen verwendest, dann läuft Dein Code glatt durch. Eine Liste reservierter Worte in DuckDB habe ich noch nicht gefunden, eine Liste reservierter Wörter in SQL allgemein findest Du beispielsweise hier: https://www.drupal.org/docs/develop/cod ... rved-words

Persönlich nenne ich Variablen gerne mit deutschen Namen, weil das dass Risiko solcher Probleme dramatisch verringert, aber da kann man auch andere Meinungen zu haben.

LG,
Bernhard



PS: Und weil ich keine Lust habe, mir Files herunterzuladen und Datenbanken als Files auf meiner Festplatter herumliegen zu haben, hier einmal voll reproduzierbarer Code, der eine in-memory Datenbank mit Aarons Beispieldaten erstellt und das Maximum von Beta findet:

Code: Alles auswählen

library("duckdb")
bsp <- structure(list(DateTime = c("01/02/2022 22:03:13.151", "01/02/2022 22:05:03.942", 
                                   "01/02/2022 22:05:09.121", "01/02/2022 22:05:09.286", "01/02/2022 22:06:04.904", 
                                   "01/02/2022 22:06:04.909", "01/02/2022 22:06:08.360", "01/02/2022 22:06:51.568", 
                                   "01/02/2022 22:06:51.573", "01/02/2022 22:06:53.234", "01/02/2022 22:06:57.617", 
                                   "01/02/2022 22:06:59.648", "01/02/2022 22:07:00.037", "01/02/2022 22:07:00.378", 
                                   "01/02/2022 22:07:13.989", "01/02/2022 22:07:14.071", "01/02/2022 22:07:15.506", 
                                   "01/02/2022 22:07:15.839", "01/02/2022 22:07:16.219", "01/02/2022 22:07:16.835", 
                                   "01/02/2022 22:07:17.185", "01/02/2022 22:07:17.214", "01/02/2022 22:07:17.517", 
                                   "01/02/2022 22:07:19.701", "01/02/2022 22:07:20.477", "01/02/2022 22:07:21.478", 
                                   "01/02/2022 22:07:22.340", "01/02/2022 22:07:23.344", "01/02/2022 22:07:27.841", 
                                   "01/02/2022 22:07:28.589", "01/02/2022 22:07:28.734", "01/02/2022 22:07:29.076", 
                                   "01/02/2022 22:07:34.188", "01/02/2022 22:07:34.528", "01/02/2022 22:07:34.873", 
                                   "01/02/2022 22:07:35.969", "01/02/2022 22:07:38.535", "01/02/2022 22:07:38.876", 
                                   "01/02/2022 22:07:39.724", "01/02/2022 22:07:40.064", "01/02/2022 22:07:41.480", 
                                   "01/02/2022 22:07:41.867", "01/02/2022 22:07:42.154", "01/02/2022 22:07:42.529", 
                                   "01/02/2022 22:07:42.876", "01/02/2022 22:07:43.052", "01/02/2022 22:07:45.152", 
                                   "01/02/2022 22:07:56.428", "01/02/2022 22:07:57.831", "01/02/2022 22:08:22.792", 
                                   "01/02/2022 22:08:27.075", "01/02/2022 22:08:44.802", "01/02/2022 22:09:06.809", 
                                   "01/02/2022 22:10:06.113", "01/02/2022 22:10:31.249", "01/02/2022 22:10:55.712", 
                                   "01/02/2022 22:10:57.487", "01/02/2022 22:10:59.516", "01/02/2022 22:11:00.230", 
                                   "01/02/2022 22:11:01.055", "01/02/2022 22:11:07.035", "01/02/2022 22:11:09.513", 
                                   "01/02/2022 22:11:21.055", "01/02/2022 22:11:54.711", "01/02/2022 22:11:59.035", 
                                   "01/02/2022 22:11:59.040", "01/02/2022 22:11:59.176", "01/02/2022 22:11:59.526", 
                                   "01/02/2022 22:12:04.055", "01/02/2022 22:12:13.584", "01/02/2022 22:12:15.179", 
                                   "01/02/2022 22:12:18.187", "01/02/2022 22:12:19.236", "01/02/2022 22:12:19.286", 
                                   "01/02/2022 22:12:22.347", "01/02/2022 22:12:59.769", "01/02/2022 22:13:06.875", 
                                   "01/02/2022 22:13:44.790", "01/02/2022 22:14:51.772", "01/02/2022 22:14:52.111", 
                                   "01/02/2022 22:17:39.167", "01/02/2022 22:17:44.168", "01/02/2022 22:20:44.170", 
                                   "01/02/2022 22:20:54.162", "01/02/2022 22:21:07.168", "01/02/2022 22:21:08.496", 
                                   "01/02/2022 22:21:12.189", "01/02/2022 22:21:16.173", "01/02/2022 22:21:21.161", 
                                   "01/02/2022 22:24:23.482", "01/02/2022 22:26:20.786", "01/02/2022 22:28:08.674", 
                                   "01/02/2022 22:28:47.375", "01/02/2022 22:28:47.974", "01/02/2022 22:29:00.012", 
                                   "01/02/2022 22:30:00.002", "01/02/2022 22:30:01.175", "01/02/2022 22:30:01.475", 
                                   "01/02/2022 22:30:05.376"), Beta = c(0.83987, 0.83959, 0.83982, 
                                                                        0.83978, 0.83981, 0.83979, 0.8398, 0.8398, 0.83959, 0.83958, 
                                                                        0.83958, 0.83957, 0.83958, 0.83959, 0.8396, 0.83961, 0.83962, 
                                                                        0.83962, 0.83963, 0.83962, 0.83963, 0.83963, 0.83962, 0.83961, 
                                                                        0.83962, 0.83961, 0.83962, 0.83961, 0.83962, 0.83963, 0.83964, 
                                                                        0.83965, 0.83966, 0.83967, 0.83966, 0.83967, 0.83968, 0.83969, 
                                                                        0.8397, 0.83971, 0.83972, 0.83973, 0.83973, 0.83974, 0.83974, 
                                                                        0.83975, 0.83974, 0.83973, 0.83967, 0.83968, 0.83967, 0.83961, 
                                                                        0.8396, 0.8396, 0.83959, 0.83962, 0.83962, 0.83974, 0.83972, 
                                                                        0.83972, 0.83975, 0.83976, 0.83974, 0.83974, 0.83997, 0.83997, 
                                                                        0.83993, 0.83991, 0.83992, 0.83991, 0.83995, 0.83994, 0.83994, 
                                                                        0.83994, 0.83973, 0.8397, 0.83973, 0.8397, 0.84004, 0.84017, 
                                                                        0.84003, 0.84017, 0.8397, 0.84017, 0.8397, 0.84003, 0.84017, 
                                                                        0.84003, 0.84017, 0.83978, 0.84017, 0.84009, 0.83978, 0.83987, 
                                                                        0.84014, 0.84014, 0.83978, 0.84016, 0.83978), Alpha = c(0.84129, 
                                                                                                                                0.84143, 0.84124, 0.8412, 0.84123, 0.84121, 0.84122, 0.84111, 
                                                                                                                                0.841, 0.841, 0.84099, 0.84099, 0.84099, 0.84099, 0.84099, 0.84099, 
                                                                                                                                0.84099, 0.841, 0.841, 0.841, 0.841, 0.84099, 0.84099, 0.84099, 
                                                                                                                                0.84099, 0.84099, 0.84099, 0.84099, 0.84099, 0.84099, 0.84099, 
                                                                                                                                0.84099, 0.84099, 0.84099, 0.84099, 0.84099, 0.84099, 0.84099, 
                                                                                                                                0.84099, 0.84099, 0.84099, 0.84099, 0.841, 0.841, 0.84099, 0.84099, 
                                                                                                                                0.84099, 0.84099, 0.84099, 0.84099, 0.84099, 0.84099, 0.84099, 
                                                                                                                                0.84102, 0.841, 0.841, 0.84099, 0.84112, 0.84112, 0.84114, 0.84117, 
                                                                                                                                0.84118, 0.84115, 0.84114, 0.84114, 0.84135, 0.84135, 0.84133, 
                                                                                                                                0.84134, 0.84133, 0.84133, 0.84133, 0.84153, 0.84154, 0.84154, 
                                                                                                                                0.84154, 0.84154, 0.84154, 0.84154, 0.84154, 0.84154, 0.84154, 
                                                                                                                                0.84154, 0.84154, 0.84154, 0.84154, 0.84154, 0.84154, 0.84154, 
                                                                                                                                0.84154, 0.84154, 0.84154, 0.84154, 0.84154, 0.84127, 0.84129, 
                                                                                                                                0.84129, 0.84129, 0.84129)), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                                 -99L))


con <- dbConnect(duckdb(), dbdir = ":memory:") 
dbWriteTable(con, "tabelle", bsp)

dbGetQuery(con, "SELECT max(Beta) FROM tabelle;")

dbDisconnect(con)
---
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: Berechnungen mit Daten aus duckdb

Beitrag von Athomas »

Kleiner Hinweis, der für Dich interessant sein könnte: bei meinen Recherchen zum Thema "DuckDB" habe ich gesehen, dass es recht einfach möglich ist, alle (z.B.) csv-Dateien aus einem Verzeichnis nach DuckDB zu laden:

Code: Alles auswählen

-- read all files with a name ending in ".csv" in the folder "dir"
SELECT * FROM 'dir/*.csv';
https://duckdb.org/docs/data/multiple_files/overview

Ich habe so mit dem Befehl (Pfade etc. beziehen sich auf Daten, wie sie auf meinem Rechner liegen!)

Code: Alles auswählen

dbExecute(con, "CREATE TABLE zsamma AS SELECT * FROM 'P:/R Progis/duckdb/Daten/*.csv';")
aus 3.653 (gleich strukturierten) csv-Dateien eine große Tabelle "zsamma" gemacht.
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Berechnungen mit Daten aus duckdb

Beitrag von bigben »

Cool :!:
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Aaron
Beiträge: 20
Registriert: Di Nov 07, 2023 9:11 am

Re: Berechnungen mit Daten aus duckdb

Beitrag von Aaron »

Danke, Danke und nochmals Danke. Das Zusammenführen der csv Dateien. Wirklich super.

Bei mir läuft der Code noch immer nicht. `dbWriteTable(con, "tabelle", bsp)` hier werden die Daten aus dem Dataframe bsp eingelesen. Was wird bei meinem Beispiel einzutragen `dbWriteTable(con, "tabelle", ???)`?
LG,
Aaron
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Berechnungen mit Daten aus duckdb

Beitrag von bigben »

Aaron hat geschrieben: Sa Nov 11, 2023 7:16 pm Danke, Danke und nochmals Danke. Das Zusammenführen der csv Dateien. Wirklich super.

Bei mir läuft der Code noch immer nicht. `dbWriteTable(con, "tabelle", bsp)` hier werden die Daten aus dem Dataframe bsp eingelesen. Was wird bei meinem Beispiel einzutragen `dbWriteTable(con, "tabelle", ???)`?
Gar nichts. Du brauchst kein dbWriteTable. Ich habe doch geschrieben:
Wenn Du in duckdb_read_csv der Tabelle einen anderen Namen gibst und dann konsequent den anderen Namen verwendest, dann läuft Dein Code glatt durch.
Und in Deinem Code, der dann glatt durchläuft, kommt dieser Befehl überhaupt nicht vor. Warum fragst Du danach??
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten