Datenimport
DuckDB-Wasm bietet mehrere Wege, Daten zu importieren, abhängig vom Datenformat.
Der Import in DuckDB erfolgt in zwei Schritten.
Zuerst wird die Datendatei mit Register-Funktionen in ein lokales Dateisystem importiert (registerEmptyFileBuffer, registerFileBuffer, registerFileHandle, registerFileText, registerFileURL).
Anschließend wird die Datendatei mit Insert-Funktionen in DuckDB importiert (insertArrowFromIPCStream, insertArrowTable, insertCSVFromPath, insertJSONFromPath) oder direkt über eine FROM-SQL-Abfrage (mit Erweiterungen wie Parquet oder Wasm-flavored httpfs).
INSERT-Anweisungen können ebenfalls zum Importieren von Daten verwendet werden.
Datenimport
Verbindung öffnen und schließen
// Create a new connectionconst c = await db.connect();
// ... import data
// Close the connection to release memoryawait c.close();Apache Arrow
// Data can be inserted from an existing arrow.Table// More Example https://arrow.apache.org/docs/js/import { tableFromArrays } from 'apache-arrow';
// EOS signal according to Arrow IPC streaming format// See https://arrow.apache.org/docs/format/Columnar.html#ipc-streaming-formatconst EOS = new Uint8Array([255, 255, 255, 255, 0, 0, 0, 0]);
const arrowTable = tableFromArrays({ id: [1, 2, 3], name: ['John', 'Jane', 'Jack'], age: [20, 21, 22],});
await c.insertArrowTable(arrowTable, { name: 'arrow_table' });// Write EOSawait c.insertArrowTable(EOS, { name: 'arrow_table' });
// ..., from a raw Arrow IPC streamconst streamResponse = await fetch(`someapi`);const streamReader = streamResponse.body.getReader();const streamInserts = [];while (true) { const { value, done } = await streamReader.read(); if (done) break; streamInserts.push(c.insertArrowFromIPCStream(value, { name: 'streamed' }));}
// Write EOSstreamInserts.push(c.insertArrowFromIPCStream(EOS, { name: 'streamed' }));
await Promise.all(streamInserts);CSV
// ..., from CSV files// (interchangeable: registerFile{Text,Buffer,URL,Handle})const csvContent = '1|foo\n2|bar\n';await db.registerFileText(`data.csv`, csvContent);// ... with typed insert optionsawait c.insertCSVFromPath('data.csv', { schema: 'main', name: 'foo', detect: false, header: false, delimiter: '|', columns: { col1: new arrow.Int32(), col2: new arrow.Utf8(), },});JSON
// ..., from JSON documents in row-major formatconst jsonRowContent = [ { "col1": 1, "col2": "foo" }, { "col1": 2, "col2": "bar" },];await db.registerFileText( 'rows.json', JSON.stringify(jsonRowContent),);await c.insertJSONFromPath('rows.json', { name: 'rows' });
// ... or column-major formatconst jsonColContent = { "col1": [1, 2], "col2": ["foo", "bar"]};await db.registerFileText( 'columns.json', JSON.stringify(jsonColContent),);await c.insertJSONFromPath('columns.json', { name: 'columns' });
// From APIconst streamResponse = await fetch(`someapi/content.json`);await db.registerFileBuffer('file.json', new Uint8Array(await streamResponse.arrayBuffer()))await c.insertJSONFromPath('file.json', { name: 'JSONContent' });Parquet
// from Parquet files// ...Localconst pickedFile: File = letUserPickFile();await db.registerFileHandle('local.parquet', pickedFile, DuckDBDataProtocol.BROWSER_FILEREADER, true);// ...Remoteawait db.registerFileURL('remote.parquet', 'https://origin/remote.parquet', DuckDBDataProtocol.HTTP, false);// ... Using Fetchconst res = await fetch('https://origin/remote.parquet');await db.registerFileBuffer('buffer.parquet', new Uint8Array(await res.arrayBuffer()));
// ..., by specifying URLs in the SQL textawait c.query(` CREATE TABLE direct AS SELECT * FROM 'https://origin/remote.parquet'`);// ..., or by executing raw insert statementsawait c.query(` INSERT INTO existing_table VALUES (1, 'foo'), (2, 'bar')`);httpfs (Wasm-flavored)
// ..., by specifying URLs in the SQL textawait c.query(` CREATE TABLE direct AS SELECT * FROM 'https://origin/remote.parquet'`);Tip Wenn Sie beim Abfragen von Dateien aus S3 auf einen Network Error (
Failed to execute 'send' on 'XMLHttpRequest') stoßen, konfigurieren Sie den S3-Berechtigungs-CORS-Header. Zum Beispiel:
[ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedOrigins": [ "*" ], "ExposeHeaders": [], "MaxAgeSeconds": 3000 }]INSERT-Anweisung
// ..., or by executing raw insert statementsawait c.query(` INSERT INTO existing_table VALUES (1, 'foo'), (2, 'bar')`);