成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我們一起聊聊 DuckDB 是什么及適用場景

數據庫 其他數據庫
官方文檔就是一個寶庫,有著非常豐富的說明及示例,網址為:https://duckdb.org/docs/index。要想深入理解及掌握 DuckDB,需要多讀讀官方文檔。

DuckDB 是一款集輕量級、高性能于一體的嵌入式分析型數據庫,以其卓越的數據查詢和分析能力在數據庫領域嶄露頭角。這款基于C++ 編寫的數據庫,以其先進的設計理念和高效的存儲引擎,為大規模數據處理提供了強有力的支持。

DuckDB 采用了獨特的列式存儲方式,相較于傳統的行式存儲,這種存儲方式能更加高效地讀取和分析數據。通過將相同列的數據集中存儲在連續的物理位置,列式存儲顯著提升了數據的訪問速度。此外,DuckDB 還利用壓縮算法進一步減少了存儲空間需求,降低了 I/O 開銷,讓數據處理變得更加輕松高效。

在查詢優化和執行方面,DuckDB 同樣表現出色。它支持標準的 SQL 查詢語言,允許用戶通過簡潔明了的 SQL 語句實現復雜的數據查詢和分析任務。其優化的執行引擎充分利用內存優勢,提供高并發和低延遲的查詢體驗。同時,DuckDB 還內置了多種查詢優化技術,通過智能地選擇查詢路徑和減少數據掃描量,進一步提高查詢效率。

作為一款嵌入式數據庫,DuckDB 還具備良好的集成性。它提供了豐富的 API 接口,使開發者能夠輕松地將 DuckDB 嵌入到各種應用程序中,實現無縫的數據管理和查詢功能。這種高度的靈活性使得 DuckDB 成為各類應用系統中的理想選擇。

DuckDB 的適用場景

1.實時分析

在追求速度和響應能力的實時分析領域,DuckDB 以其高性能和低延遲的特性成為不可或缺的工具。無論是監控系統、實時報表還是預警系統,DuckDB 都能快速響應大量的數據查詢請求,提供準確而及時的分析結果。這使得企業能夠實時掌握業務動態,做出快速而明智的決策。

此外,DuckDB 的內存優化特性進一步提升了實時分析的效率。通過將盡可能多的數據加載到內存中,DuckDB 能夠顯著減少磁盤 I/O 操作,從而加快查詢速度。這種優勢在處理大規模數據集時尤為明顯,讓實時分析變得更加輕松高效。

2.數據倉庫

DuckDB 同樣適用于構建和管理數據倉庫系統。作為輕量級的數據倉庫解決方案,它能夠輕松應對數據整合、清洗和轉換等復雜任務。通過 ETL 過程,DuckDB 能夠將來自不同數據源的數據整合到一起,形成統一的數據視圖。然后,用戶可以利用其強大的查詢和分析能力,深入挖掘數據的價值,發現潛在的商業機會。

相較于傳統的大型關系型數據庫,DuckDB 在數據倉庫場景中具有更低的部署和維護成本。其輕量級特性使得數據倉庫的構建和管理變得更加簡單高效,無需投入大量的人力和物力資源。同時,DuckDB 的高性能和可擴展性也能夠滿足大型數據倉庫的需求,確保數據的快速處理和查詢。

3.嵌入式應用

DuckDB 的嵌入式特性使其成為嵌入式應用的理想選擇。無論是物聯網設備還是移動應用程序,都可以通過集成 DuckDB 實現本地數據分析能力。這意味著設備或應用程序可以直接在本地處理和分析數據,無需依賴遠程服務器或云端資源。

在物聯網設備中,DuckDB 可以幫助實現實時的數據采集和分析,提升設備的智能化水平。在移動應用程序中,它可以用于存儲和分析用戶數據,提供個性化的服務和推薦,提升用戶體驗。

4.大數據預處理

大數據預處理是數據挖掘和機器學習流程中不可或缺的一環。在這一環節中,DuckDB 同樣可以發揮重要作用。它能夠高效地對數據進行清洗、轉換和聚合等操作,為后續的機器學習或數據挖掘任務提供高質量的輸入數據。

DuckDB 支持各種復雜的 SQL 查詢和聚合操作,使得預處理工作變得更加簡單高效。用戶可以通過編寫SQL語句來定義數據轉換規則和處理邏輯,然后讓 DuckDB 自動完成這些任務。這大大減輕了數據科學家的工作負擔,讓他們能夠更專注于數據分析和模型構建等核心任務。

接下來我們就理論聯系實際地使用一下 DuckDB,看看它有什么驚艷的地方。

安裝及簡單使用

# MacOS 安裝
$ brew install duckdb


# Python 安裝
pip install duckdb


# NodeJS 安裝
npm install duckdb


# 或者從源碼安裝,愿意折騰的同學可以自行去安裝

安裝完成后,怎么使用呢?可以打開命令行直接輸入 "duckdb" 即可進入其命令行界面:

(venv311) ?  mypostgres git:(dev) duckdb
v1.0.0 1f98600c2c
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.


-- 查看版本號
D SELECT version();
┌───────────┐
│ version() │
│  varchar  │
├───────────┤
│ v1.0.0    │
└───────────┘


-- 下面的是官方的 Live Demo 中的一個示例,從 S3 存儲上面下載了一個數據文件,并導入到 DuckDB 中
D INSTALL httpfs;
100% ▕████████████████████████████████████████████████████████████▏ 
D CREATE TABLE train_services AS FROM 's3://duckdb-blobs/train_services.parquet';
100% ▕████████████████████████████████████████████████████████████▏ 
D show tables;
┌────────────────┐
│      name      │
│    varchar     │
├────────────────┤
│ train_services │
└────────────────┘
-- 或者執行 .tables 也可以查看有哪些表
D .tables
train_services

如何查看表結構呢?

D DESCRIBE train_services;
+----------------+-------------+------+-----+---------+-------+
|  column_name   | column_type | null | key | default | extra |
+----------------+-------------+------+-----+---------+-------+
| service_id     | BIGINT      | YES  |     |         |       |
| date           | DATE        | YES  |     |         |       |
| type           | VARCHAR     | YES  |     |         |       |
| train_number   | BIGINT      | YES  |     |         |       |
| station_code   | VARCHAR     | YES  |     |         |       |
| station_name   | VARCHAR     | YES  |     |         |       |
| departure_time | TIMESTAMP   | YES  |     |         |       |
| arrival_time   | TIMESTAMP   | YES  |     |         |       |
+----------------+-------------+------+-----+---------+-------+
changes: 380959   total_changes: 380959

查詢 train_services 表的前 10 條數據:

D SELECT * from train_services LIMIT 10;
┌────────────┬────────────┬───────────┬──────────────┬──────────────┬──────────────────────┬─────────────────────┬─────────────────────┐
│ service_id │    date    │   type    │ train_number │ station_code │     station_name     │   departure_time    │    arrival_time     │
│   int64    │    date    │  varchar  │    int64     │   varchar    │       varchar        │      timestamp      │      timestamp      │
├────────────┼────────────┼───────────┼──────────────┼──────────────┼──────────────────────┼─────────────────────┼─────────────────────┤
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ RTD          │ Rotterdam Centraal   │ 2023-05-15 00:00:00 │                     │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ DT           │ Delft                │ 2023-05-15 00:13:00 │ 2023-05-15 00:13:00 │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ GV           │ Den Haag HS          │ 2023-05-15 00:29:00 │ 2023-05-15 00:21:00 │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ LEDN         │ Leiden Centraal      │ 2023-05-15 00:45:00 │ 2023-05-15 00:44:00 │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ SHL          │ Schiphol Airport     │ 2023-05-15 01:03:00 │ 2023-05-15 01:01:00 │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ ASD          │ Amsterdam Centraal   │ 2023-05-15 01:19:00 │ 2023-05-15 01:17:00 │
│   11196117 │ 2023-05-15 │ Intercity │         1410 │ UT           │ Utrecht Centraal     │                     │ 2023-05-15 01:48:00 │
│   11196118 │ 2023-05-15 │ Nightjet  │          420 │ NURNB        │ Nürnberg Hbf         │ 2023-05-15 00:01:00 │                     │
│   11196118 │ 2023-05-15 │ Nightjet  │          420 │ FFS          │ Frankfurt (Main) Süd │ 2023-05-15 01:47:00 │ 2023-05-15 01:45:00 │
│   11196118 │ 2023-05-15 │ Nightjet  │          420 │ FFFM         │ Frankfurt (M) Hbf    │                     │                     │
├────────────┴────────────┴───────────┴──────────────┴──────────────┴──────────────────────┴─────────────────────┴─────────────────────┤
│ 10 rows                                                                                                                    8 columns │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

還可以設置輸出樣式,默認是 duckbox 樣式:

D .help mode
.mode MODE ?TABLE?       Set output mode
   MODE is one of:
     ascii     Columns/rows delimited by 0x1F and 0x1E
     box       Tables using unicode box-drawing characters
     csv       Comma-separated values
     column    Output in columns.  (See .width)
     duckbox   Tables with extensive features
     html      HTML <table> code
     insert    SQL insert statements for TABLE
     json      Results in a JSON array
     jsonlines Results in a NDJSON
     latex     LaTeX tabular environment code
     line      One value per line
     list      Values delimited by "|"
     markdown  Markdown table format
     quote     Escape answers as for SQL
     table     ASCII-art table
     tabs      Tab-separated values
     tcl       TCL list elements
     trash     No output


D .mode table


D SELECT * from train_services LIMIT 10;
+------------+------------+-----------+--------------+--------------+----------------------+---------------------+---------------------+
| service_id |    date    |   type    | train_number | station_code |     station_name     |   departure_time    |    arrival_time     |
+------------+------------+-----------+--------------+--------------+----------------------+---------------------+---------------------+
| 11196117   | 2023-05-15 | Intercity | 1410         | RTD          | Rotterdam Centraal   | 2023-05-15 00:00:00 |                     |
| 11196117   | 2023-05-15 | Intercity | 1410         | DT           | Delft                | 2023-05-15 00:13:00 | 2023-05-15 00:13:00 |
| 11196117   | 2023-05-15 | Intercity | 1410         | GV           | Den Haag HS          | 2023-05-15 00:29:00 | 2023-05-15 00:21:00 |
| 11196117   | 2023-05-15 | Intercity | 1410         | LEDN         | Leiden Centraal      | 2023-05-15 00:45:00 | 2023-05-15 00:44:00 |
| 11196117   | 2023-05-15 | Intercity | 1410         | SHL          | Schiphol Airport     | 2023-05-15 01:03:00 | 2023-05-15 01:01:00 |
| 11196117   | 2023-05-15 | Intercity | 1410         | ASD          | Amsterdam Centraal   | 2023-05-15 01:19:00 | 2023-05-15 01:17:00 |
| 11196117   | 2023-05-15 | Intercity | 1410         | UT           | Utrecht Centraal     |                     | 2023-05-15 01:48:00 |
| 11196118   | 2023-05-15 | Nightjet  | 420          | NURNB        | Nürnberg Hbf         | 2023-05-15 00:01:00 |                     |
| 11196118   | 2023-05-15 | Nightjet  | 420          | FFS          | Frankfurt (Main) Süd | 2023-05-15 01:47:00 | 2023-05-15 01:45:00 |
| 11196118   | 2023-05-15 | Nightjet  | 420          | FFFM         | Frankfurt (M) Hbf    |                     |                     |
+------------+------------+-----------+--------------+--------------+----------------------+---------------------+---------------------+

還可以獲取命令的幫助,進入 DuckDB 后,輸入 `.help` 即可查看幫助手信息:

D .help
.bail on|off             Stop after hitting an error.  Default OFF
.binary on|off           Turn binary output on or off.  Default OFF
.cd DIRECTORY            Change the working directory to DIRECTORY
.changes on|off          Show number of rows changed by SQL
.check GLOB              Fail if output since .testcase does not match
.columns                 Column-wise rendering of query results
.constant ?COLOR?        Sets the syntax highlighting color used for constant values
.constantcode ?CODE?     Sets the syntax highlighting terminal code used for constant values
......
.sha3sum ...             Compute a SHA3 hash of database content
.shell CMD ARGS...       Run CMD ARGS... in a system shell
.show                    Show the current values for various settings
.system CMD ARGS...      Run CMD ARGS... in a system shell
.tables ?TABLE?          List names of tables matching LIKE pattern TABLE
.testcase NAME           Begin redirecting output to 'testcase-out.txt'
.timer on|off            Turn SQL timer on or off
.width NUM1 NUM2 ...     Set minimum column widths for columnar output

導出CSV文件

可以輕松地把數據導出到 CSV 文件:

D COPY train_services TO 'output.csv' (HEADER, DELIMITER ',');


-- 查看文件前 10 行內容
D .shell head /tmp/output.csv
service_id,date,type,train_number,station_code,station_name,departure_time,arrival_time
11196117,2023-05-15,Intercity,1410,RTD,Rotterdam Centraal,2023-05-15 00:00:00,
11196117,2023-05-15,Intercity,1410,DT,Delft,2023-05-15 00:13:00,2023-05-15 00:13:00
11196117,2023-05-15,Intercity,1410,GV,Den Haag HS,2023-05-15 00:29:00,2023-05-15 00:21:00
11196117,2023-05-15,Intercity,1410,LEDN,Leiden Centraal,2023-05-15 00:45:00,2023-05-15 00:44:00
11196117,2023-05-15,Intercity,1410,SHL,Schiphol Airport,2023-05-15 01:03:00,2023-05-15 01:01:00
11196117,2023-05-15,Intercity,1410,ASD,Amsterdam Centraal,2023-05-15 01:19:00,2023-05-15 01:17:00
11196117,2023-05-15,Intercity,1410,UT,Utrecht Centraal,,2023-05-15 01:48:00
11196118,2023-05-15,Nightjet,420,NURNB,Nürnberg Hbf,2023-05-15 00:01:00,
11196118,2023-05-15,Nightjet,420,FFS,Frankfurt (Main) Süd,2023-05-15 01:47:00,2023-05-15 01:45:00

查詢的數據也可以導出到 CSV 文件:

COPY (SELECT * FROM tbl) TO 'output.csv' (HEADER, DELIMITER ',');

導入CSV文件

導入 CSV 文件有多種方式:

-- 通過 read_csv() 函數直接讀取 CSV 文件
D SELECT * FROM read_csv("/tmp/output.csv");
┌────────────┬────────────┬──────────────────────┬──────────────┬──────────────┬───────────────────────────┬─────────────────────┬─────────────────────┐
│ service_id │    date    │         type         │ train_number │ station_code │       station_name        │   departure_time    │    arrival_time     │
│   int64    │    date    │       varchar        │    int64     │   varchar    │          varchar          │      timestamp      │      timestamp      │
├────────────┼────────────┼──────────────────────┼──────────────┼──────────────┼───────────────────────────┼─────────────────────┼─────────────────────┤
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ RTD          │ Rotterdam Centraal        │ 2023-05-15 00:00:00 │                     │
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ DT           │ Delft                     │ 2023-05-15 00:13:00 │ 2023-05-15 00:13:00 │
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ GV           │ Den Haag HS               │ 2023-05-15 00:29:00 │ 2023-05-15 00:21:00 │
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ LEDN         │ Leiden Centraal           │ 2023-05-15 00:45:00 │ 2023-05-15 00:44:00 │
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ SHL          │ Schiphol Airport          │ 2023-05-15 01:03:00 │ 2023-05-15 01:01:00 │
......
......
│   11239115 │ 2023-05-21 │ Stoptrein            │        20397 │ RHEINE       │ Rheine                    │ 2023-05-21 11:03:00 │                     │
│   11239115 │ 2023-05-21 │ Stoptrein            │        20397 │ BH           │ Bad Bentheim              │ 2023-05-21 11:16:00 │ 2023-05-21 11:14:00 │
│   11239115 │ 2023-05-21 │ Stoptrein            │        20397 │ HGL          │ Hengelo                   │                     │ 2023-05-21 11:32:00 │
├────────────┴────────────┴──────────────────────┴──────────────┴──────────────┴───────────────────────────┴─────────────────────┴─────────────────────┤
│ 380959 rows (40 shown)                                                                                                                     8 columns │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘


-- 也可以不顯式使用 read_csv() 函數
D SELECT * FROM "/tmp/output.csv";
┌────────────┬────────────┬──────────────────────┬──────────────┬──────────────┬───────────────────────────┬─────────────────────┬─────────────────────┐
│ service_id │    date    │         type         │ train_number │ station_code │       station_name        │   departure_time    │    arrival_time     │
│   int64    │    date    │       varchar        │    int64     │   varchar    │          varchar          │      timestamp      │      timestamp      │
├────────────┼────────────┼──────────────────────┼──────────────┼──────────────┼───────────────────────────┼─────────────────────┼─────────────────────┤
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ RTD          │ Rotterdam Centraal        │ 2023-05-15 00:00:00 │                     │
│   11196117 │ 2023-05-15 │ Intercity            │         1410 │ DT           │ Delft                     │ 2023-05-15 00:13:00 │ 2023-05-15 00:13:00 │
......
......
│   11239115 │ 2023-05-21 │ Stoptrein            │        20397 │ HGL          │ Hengelo                   │                     │ 2023-05-21 11:32:00 │
├────────────┴────────────┴──────────────────────┴──────────────┴──────────────┴───────────────────────────┴─────────────────────┴─────────────────────┤
│ 380959 rows (40 shown)                                                                                                                     8 columns │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

     

 關于數據導入可以參閱官方文檔:https://duckdb.org/docs/data/overview。DuckDB 支持非常多的數據庫格式,為我們快速做數據分析提供各種便捷功能。

連接或創建數據庫

前面的操作都是在內存中進行的,也就意味著當我們退出當前的 DuckDB 會話時,數據也會隨之釋放。DuckDB 也支持持久模式運行,這樣數據可以存放在硬盤上面。我們可以看下 DuckDB 程序的命令行幫助:

?  knowledge git:(liucc) ? duckdb --help
Usage: duckdb [OPTIONS] FILENAME [SQL]
FILENAME is the name of an DuckDB database. A new database is created
if the file does not previously exist.
OPTIONS include:
   -append              append the database to the end of the file
   -ascii               set output mode to 'ascii'
   -bail                stop after hitting an error
   -batch               force batch I/O
   -box                 set output mode to 'box'
   -column              set output mode to 'column'
   -cmd COMMAND         run "COMMAND" before reading stdin
   -c COMMAND           run "COMMAND" and exit
   -csv                 set output mode to 'csv'
   -echo                print commands before execution
   -init FILENAME       read/process named file
   -[no]header          turn headers on or off
   -help                show this message
   -html                set output mode to HTML
   -interactive         force interactive I/O
   -json                set output mode to 'json'
   -line                set output mode to 'line'
   -list                set output mode to 'list'
   -markdown            set output mode to 'markdown'
   -newline SEP         set output row separator. Default: '\n'
   -nofollow            refuse to open symbolic links to database files
   -no-stdin            exit after processing options instead of reading stdin
   -nullvalue TEXT      set text string for NULL values. Default ''
   -quote               set output mode to 'quote'
   -readonly            open the database read-only
   -s COMMAND           run "COMMAND" and exit
   -separator SEP       set output column separator. Default: '|'
   -stats               print memory stats before each finalize
   -table               set output mode to 'table'
   -unredacted          allow printing unredacted secrets
   -unsigned            allow loading of unsigned extensions
   -version             show DuckDB version

通過命令行的幫助信息可以知道,我們可以在 duckdb 程序后面提供一個 FILENAME,這個 FILENAME 就是一個數據庫,如果存在就打開(連接)該庫,如果該庫不存在則創建。

接下來我們演示一下,首先我們準備一些測試數據:

$ wget -c -O ~/Downloads/services-2023-10.csv.gz https://opendata.rijdendetreinen.nl/public/services/services-2023-10.csv.gz

下載完成數據之后,我們通過 DuckDB 創建一個空的庫,然后導入該示例數據。如下:

$ duckdb railway.db

[!tip]

該文件可以為任意擴展名,但 .db 或 .duckdb 是兩種常見選擇,有時也會使用 .ddb。

進入數據庫后,我們導入前面已下載的壓縮數據:

D CREATE TABLE services AS FROM '~/Downloads/services-2023.csv.gz';
100% ▕████████████████████████████████████████████████████████████▏ 


-- 查看一下有哪些表
D .tables
services


-- 查看一下當前的庫是什么,以下三種方式都可以
D .data
railway: railway.db
D .database
railway: railway.db
D .databases
railway: railway.db

上面都發生了什么?我們簡單解釋一下:

我們無需顯式定義我們的 services 表的結構,也不需要使用 COPY  FROM 語句。DuckDB 會自動檢測到 'services-2023.csv.gz' 是一個 gzip 壓縮的 CSV 文件,因此它調用 read_csv() 函數,解壓文件并根據其內容使用 CSV 嗅探器推斷其數據結構。

查詢利用了 DuckDB 的 FROM-first 語法,允許用戶省略 SELECT * 子句。因此,SQL 語句 FROM 'services-2023.csv.gz'; 是 SELECT * FROM 'services-2023.csv.gz'; 的簡寫。

D FROM services LIMIT 10;
┌────────────────┬──────────────┬──────────────┬─────────────────┬───┬────────────────────┬──────────────────────┬─────────────────────┬──────────────────────┬──────────────────────┐
│ Service:RDT-ID │ Service:Date │ Service:Type │ Service:Company │ … │ Stop:Arrival delay │ Stop:Arrival cance…  │ Stop:Departure time │ Stop:Departure delay │ Stop:Departure can…  │
│     int64      │     date     │   varchar    │     varchar     │   │       int64        │       boolean        │      timestamp      │        int64         │       boolean        │
├────────────────┼──────────────┼──────────────┼─────────────────┼───┼────────────────────┼──────────────────────┼─────────────────────┼──────────────────────┼──────────────────────┤
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                    │                      │ 2023-01-01 01:00:00 │                    1 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  0 │ false                │ 2023-01-01 01:13:00 │                    0 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  0 │ false                │ 2023-01-01 01:22:00 │                    0 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  0 │ false                │ 2023-01-01 01:40:00 │                    0 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  0 │ false                │ 2023-01-01 02:03:00 │                    0 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  2 │ false                │ 2023-01-01 02:12:00 │                    2 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  1 │ false                │ 2023-01-01 02:19:00 │                    3 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  3 │ false                │ 2023-01-01 02:30:00 │                    3 │ false                │
│       10367702 │ 2023-01-01   │ Intercity    │ NS              │ … │                  2 │ false                │                     │                      │                      │
│       10367703 │ 2023-01-01   │ Nightjet     │ NS Int          │ … │                    │                      │ 2023-01-01 01:01:00 │                    0 │ false                │
├────────────────┴──────────────┴──────────────┴─────────────────┴───┴────────────────────┴──────────────────────┴─────────────────────┴──────────────────────┴──────────────────────┤
│ 10 rows                                                                                                                                                       17 columns (9 shown) │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
  • 查詢創建一個名為 services 的表,并使用 CSV 讀取器的結果寫入該表。使用 `CREATE TABLE ...AS` 語句。

我們看看 services 表里面有多少行數據:

D SELECT count(*) AS count_services FROM services;
┌────────────────┐
│ count_services │
│     int64      │
├────────────────┤
│       21239393 │
└────────────────┘


D SELECT format('{:,}', count(*)) AS count_services FROM services;
┌────────────────┐
│ count_services │
│    varchar     │
├────────────────┤
│ 21,239,393     │
└────────────────┘

我們現在看下 railway.db 目前占用了多少硬盤空間:

?  softwares ll -h railway.db 
-rw-r--r--  1 liuchuan  staff   394M Jun 17 14:40 railway.db

其他數據庫集成

然 DuckDB 有 ETL 功能,那么它就可以與多個數據庫引擎進行交互。接下來我們看下 DuckDB 與其他數據庫引擎的集成。

1.與 MySQL 集成

要直接在 MySQL 數據庫上運行查詢,需要 mysql 擴展。可以使用 INSTALL SQL 命令安裝擴展。只需要運行一次即可:

D INSTALL mysql;
100% ▕████████████████████████████████████████████████████████████

要想使用 mysql 擴展,需要使用 LOAD SQL 命令:

D LOAD mysql;

mysql 擴展加載完成后,我們可以使用 ATTACH SQL 命令來映射到一個 MySQL 實例上面。語法如下:

ATTACH 'host=localhost user=root port=0 database=mysqlscanner' AS mysql_db (TYPE mysql_scanner, READ_ONLY);
USE mysql_db;

ATTACH 使用的字符串是 PostgreSQL 風格的連接字符串(不是 MySQL 連接字符串!)。這是一個以 {key}={value} 格式提供的連接參數列表。以下是有效參數列表。任何未提供的選項都會被其默認值所取代。

圖片圖片

接下來是一個實際的例子,讓我們連接到本地的一個 MySQL 數據庫:

D ATTACH 'host=localhost user=root password=123456 port=3306 database=world' AS mysql_world_db (TYPE mysql_scanner, READ_ONLY);


-- 接下來就像是使用 MySQL 那樣來使用數據庫了
D use mysql_world_db;
D show tables;
┌─────────────────┐
│      name       │
│     varchar     │
├─────────────────┤
│ city            │
│ country         │
│ countrylanguage │
└─────────────────┘


-- 查詢一下 country 表里面的數據
D SELECT Code, Name, Region FROM country WHERE Code LIKE 'C%%';
┌─────────┬───────────────────────────────────────┬───────────────────────────┐
│  Code   │                 Name                  │          Region           │
│ varchar │                varchar                │          varchar          │
├─────────┼───────────────────────────────────────┼───────────────────────────┤
│ CAF     │ Central African Republic              │ Central Africa            │
│ CAN     │ Canada                                │ North America             │
│ CCK     │ Cocos (Keeling) Islands               │ Australia and New Zealand │
│ CHE     │ Switzerland                           │ Western Europe            │
│ CHL     │ Chile                                 │ South America             │
│ CHN     │ China                                 │ Eastern Asia              │
│ CIV     │ C?te d’Ivoire                         │ Western Africa            │
│ CMR     │ Cameroon                              │ Central Africa            │
│ COD     │ Congo, The Democratic Republic of the │ Central Africa            │
│ COG     │ Congo                                 │ Central Africa            │
│ COK     │ Cook Islands                          │ Polynesia                 │
│ COL     │ Colombia                              │ South America             │
│ COM     │ Comoros                               │ Eastern Africa            │
│ CPV     │ Cape Verde                            │ Western Africa            │
│ CRI     │ Costa Rica                            │ Central America           │
│ CUB     │ Cuba                                  │ Caribbean                 │
│ CXR     │ Christmas Island                      │ Australia and New Zealand │
│ CYM     │ Cayman Islands                        │ Caribbean                 │
│ CYP     │ Cyprus                                │ Middle East               │
│ CZE     │ Czech Republic                        │ Eastern Europe            │
├─────────┴───────────────────────────────────────┴───────────────────────────┤
│ 20 rows                                                           3 columns │
└─────────────────────────────────────────────────────────────────────────────┘

由于我們連接時指定了 READ_ONLY 選項,那么我們是以只讀模式連接過來的,無法進行增刪改的操作。如下:

-- 創建一張表
D CREATE TABLE tbl (id INTEGER, name VARCHAR);
Invalid Input Error: Cannot execute statement of type "CREATE" on database "mysql_world_db" which is attached in read-only mode!


-- 刪除一條數據
D DELETE FROM country WHERE Code = 'USA';
Invalid Input Error: Cannot execute statement of type "DELETE" on database "mysql_world_db" which is attached in read-only mode!

[!tip]

以讀寫模式連接數據庫:只需設置 (TYPE MYSQL) 即可,去掉 READ_ONLY。

關于與 MySQL 集成相關的更詳細信息,還請參閱官方文檔:https://duckdb.org/docs/extensions/mysql.html#supported-operations。

2.與 PostgreSQL 集成

與集成 MySQL 一樣,需要先安裝擴展,然后加載。

D INSTALL postgres;
100% ▕████████████████████████████████████████████████████████████


D LOAD postgres;

安裝 postgres 擴展后,可以使用 postgres_scan 函數從 PostgreSQL 查詢表:

-- scan the table "mytable" from the schema "public" in the database "mydb"
SELECT * FROM postgres_scan('host=localhost port=5432 dbname=mydb', 'public', 'mytable');

“postgres_scan” 函數的第一個參數是 [PostgreSQL 連接字符串](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING),

這是以 “{key}={value}” 格式提供的連接參數列表。下面是詳細的參數列表。

圖片圖片

接下來我們連接到本地的一個 PostgreSQL 數據庫上面進行一個查詢:

D SELECT * FROM postgres_scan('host=localhost port=5432 user=forum password=forum dbname=forumdb', 'forum', 'categories');
┌───────┬───────────────────────┬──────────────────────────────────┐
│  pk   │         title         │           description            │
│ int32 │        varchar        │             varchar              │
├───────┼───────────────────────┼──────────────────────────────────┤
│     3 │ Programming Languages │ All about programming languages  │
│     5 │ Software engineering  │ Software engineering discussions │
│     1 │ Database Discussions  │ Database discussions             │
│     2 │ Unix/Linux discussion │ Unix and Linux discussions       │
│     4 │ A.I                   │ Machine Learning discussions     │
└───────┴───────────────────────┴──────────────────────────────────┘

或者,可以使用 ATTACH 命令連接整個數據庫。這允許我們像查詢常規數據庫一樣查詢存儲在 PostgreSQL 數據庫中的所有表。語法如下:

-- Attach the Postgres database using the given connection string
ATTACH 'host=localhost port=5432 dbname=mydb' AS test (TYPE postgres);
-- The table "tbl_name" can now be queried as if it is a regular table
SELECT * FROM test.tbl_name;
-- Switch the active database to "test"
USE test;


-- List all tables in the file
SHOW TABLES;

一個實際的例子:

D ATTACH 'host=localhost port=5432 user=forum password=forum dbname=forumdb' AS pg_forum_db (TYPE postgres);
D use pg_forum_db;


-- 查詢數據
D SELECT * from forum.categories;
┌───────┬───────────────────────┬──────────────────────────────────┐
│  pk   │         title         │           description            │
│ int32 │        varchar        │             varchar              │
├───────┼───────────────────────┼──────────────────────────────────┤
│     3 │ Programming Languages │ All about programming languages  │
│     5 │ Software engineering  │ Software engineering discussions │
│     1 │ Database Discussions  │ Database discussions             │
│     2 │ Unix/Linux discussion │ Unix and Linux discussions       │
│     4 │ A.I                   │ Machine Learning discussions     │
└───────┴───────────────────────┴──────────────────────────────────┘

由于我們在映射數據庫時并沒有使用 READ_ONLY 選項,因此可以對 pg_forum_db 進行讀寫操作。如下:

D CREATE TABLE forum.demo (id INTEGER, name VARCHAR);
D DESCRIBE forum.demo;
┌─────────────┬─────────────┬─────────┬─────────┬─────────┬─────────┐
│ column_name │ column_type │  null   │   key   │ default │  extra  │
│   varchar   │   varchar   │ varchar │ varchar │ varchar │ varchar │
├─────────────┼─────────────┼─────────┼─────────┼─────────┼─────────┤
│ id          │ INTEGER     │ YES     │         │         │         │
│ name        │ VARCHAR     │ YES     │         │         │         │
└─────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┘


-- 插入一條數據
D INSERT INTO forum.demo VALUES (42, 'DuckDB');


-- 查看該數據
D FROM forum.demo;
┌───────┬─────────┐
│  id   │  name   │
│ int32 │ varchar │
├───────┼─────────┤
│    42 │ DuckDB  │
└───────┴─────────┘


-- 修改該數據
D UPDATE forum.demo set id=9 WHERE name='DuckDB';
D FROM forum.demo;
┌───────┬─────────┐
│  id   │  name   │
│ int32 │ varchar │
├───────┼─────────┤
│     9 │ DuckDB  │
└───────┴─────────┘


-- 刪除該數據
D DELETE FROM forum.demo WHERE id=9;
D FROM forum.demo;
┌───────┬─────────┐
│  id   │  name   │
│ int32 │ varchar │
├───────┴─────────┤
│     0 rows      │
└─────────────────┘


-- 刪除該表
D DROP TABLE forum.demo;
D DESCRIBE forum.demo;
Catalog Error: Table with name demo does not exist!
Did you mean "mysql_world_db.mysql.db"?

可以檢查下我們目前都連接了哪些數據庫:

D show databases;
┌────────────────┐
│ database_name  │
│    varchar     │
├────────────────┤
│ mysql_world_db │
│ pg_forum_db    │
│ railway        │
└────────────────┘


D .databases
railway: railway.db
mysql_world_db: host=localhost user=root password=123456 port=3306 database=world
pg_forumd_db: host=localhost port=5432 user=forum password=forum dbname=forumdb

關于與 PostgreSQL 集成更詳細的信息可以參閱官方文檔:https://duckdb.org/docs/extensions/postgres.html。

DuckDB 還能與 SQLite 進行集成,這里就不再演示了,可以參閱官方文檔:https://duckdb.org/docs/guides/database_integration/sqlite。

擴展支持

一個產品強或系統不強,關鍵還是要看下擴展多不多。正所謂:“功能不夠,擴展來湊”。我們看下缺省狀態下 DuckDB 支持的擴展:

不同的 DuckDB 客戶端都附帶了一組不同的擴展。我們在下表中進行一個比對:

圖片圖片

關于官方提供的擴展,可以參閱官方文檔:https://duckdb.org/docs/extensions/official_extensions。

可以查看當前 DuckDB 已安裝的擴展:

D .mode line
D SELECT * FROM duckdb_extensions();
   extension_name = arrow
           loaded = false
        installed = false
     install_path = 
      description = A zero-copy data integration between Apache Arrow and DuckDB
          aliases = []
extension_version = 
     install_mode = 
   installed_from = 


   extension_name = autocomplete
           loaded = true
        installed = true
     install_path = (BUILT-IN)
      description = Adds support for autocomplete in the shell
          aliases = []
extension_version = 
     install_mode = STATICALLY_LINKED
   installed_from = 


......
......


   extension_name = vss
           loaded = false
        installed = false
     install_path = 
      description = Adds indexing support to accelerate Vector Similarity Search
          aliases = []
extension_version = 
     install_mode = 
   installed_from =

客戶端API

DuckDB 還支持豐富的客戶端 API,允許我們通過程序來使用 DuckDB。接下來我們以 Golang 為例進行一個演示。代碼如下:

package main


import (
  "database/sql"
  "errors"
  "fmt"
  "log"


  _ "github.com/marcboeker/go-duckdb"
)


func main() {
  db, err := sql.Open("duckdb", "")
  if err != nil {
    log.Fatal(err)
  }
  defer db.Close()


  _, err = db.Exec(`CREATE TABLE people (id INTEGER, name VARCHAR)`)
  if err != nil {
    log.Fatal(err)
  }
  _, err = db.Exec(`INSERT INTO people VALUES (42, 'John')`)
  if err != nil {
    log.Fatal(err)
  }


  var (
    id   int
    name string
  )
  row := db.QueryRow(`SELECT id, name FROM people`)
  err = row.Scan(&id, &name)
  if errors.Is(err, sql.ErrNoRows) {
    log.Println("no rows")
  } else if err != nil {
    log.Fatal(err)
  }


  fmt.Printf("id: %d, name: %s\n", id, name)
}

接下來我們進行編譯:

$ mkdir myduck
$ mv main.go myduck/
$ go mod init
$ go mod tidy
go: finding module for package github.com/marcboeker/go-duckdb
go: downloading github.com/marcboeker/go-duckdb v1.7.0
go: found github.com/marcboeker/go-duckdb in github.com/marcboeker/go-duckdb v1.7.0
go: downloading github.com/apache/arrow/go/v14 v14.0.2
go: downloading github.com/google/uuid v1.3.1
go: downloading golang.org/x/tools v0.14.0
go: downloading github.com/google/flatbuffers v23.5.26+incompatible
go: downloading github.com/klauspost/compress v1.16.7
go: downloading github.com/zeebo/xxh3 v1.0.2
go: downloading github.com/pierrec/lz4/v4 v4.1.18
go: downloading golang.org/x/mod v0.13.0
go: downloading github.com/klauspost/cpuid/v2 v2.2.5
go: downloading golang.org/x/exp v0.0.0-20231006140011-7918f672742d
go: downloading gonum.org/v1/gonum v0.12.0
go: downloading github.com/zeebo/assert v1.3.0


$ go build main.go 
$ ll -h
total 81496
-rw-r--r--  1 liuchuan  staff   678B Jun 17 16:53 go.mod
-rw-r--r--  1 liuchuan  staff   3.8K Jun 17 16:53 go.sum
-rwxr-xr-x  1 liuchuan  staff    40M Jun 17 16:54 main   # 編譯出來的文件還是挺大的
-rw-r--r--  1 liuchuan  staff   678B Jun 17 16:52 main.go

我們運行一下代碼:

$ ./main 
id: 42, name: John

關于更詳細的客戶端 API 信息,可以參閱官方文檔:https://duckdb.org/docs/api/overview。

總結

另外,官方文檔就是一個寶庫,有著非常豐富的說明及示例,網址為:https://duckdb.org/docs/index。要想深入理解及掌握 DuckDB,需要多讀讀官方文檔。

綜上所述,DuckDB 作為一款集輕量級、高性能于一體的嵌入式分析型數據庫,在實時分析、數據倉庫、嵌入式應用和大數據預處理等領域都展現出了其獨特的優勢。其內存優化特性、低延遲性能和靈活的集成方式使得它成為各類應用系統中的理想選擇。隨著數據分析和處理需求的不斷增長,相信 DuckDB 將在未來繼續發揮重要作用,為各行各業提供更高效、更可靠的數據支持。

如有相關問題,請在文章后面給小編留言,小編安排作者第一時間和您聯系,為您答疑解惑。

責任編輯:武曉燕 來源: 新鈦云服
相關推薦

2023-03-29 08:26:06

2022-02-23 08:41:58

NATIPv4IPv6

2022-08-01 07:57:03

數組操作內存

2024-02-20 21:34:16

循環GolangGo

2021-08-27 07:06:10

IOJava抽象

2023-08-10 08:28:46

網絡編程通信

2023-08-04 08:20:56

DockerfileDocker工具

2023-06-30 08:18:51

敏捷開發模式

2022-05-24 08:21:16

數據安全API

2023-09-10 21:42:31

2024-09-27 09:56:43

2022-05-26 00:19:29

通信信息5G

2022-10-28 07:27:17

Netty異步Future

2022-11-12 12:33:38

CSS預處理器Sass

2022-06-26 09:40:55

Django框架服務

2023-04-26 07:30:00

promptUI非結構化

2022-02-14 07:03:31

網站安全MFA

2022-12-07 13:12:15

2025-03-27 02:00:00

SPIJava接口

2023-07-27 07:46:51

SAFe團隊測試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 最新国产精品精品视频 | 欧美日韩中文字幕 | 中文一区二区 | 日韩一区三区 | 欧美激情在线播放 | 久久久久亚洲 | 9191在线观看 | 成人特区| 日韩a在线 | 日韩黄a| 日韩中文字幕 | 久久免费小视频 | 日韩欧美精品在线 | 午夜精品一区二区三区在线观看 | 国产成人91视频 | 久久99精品久久久 | 五月婷婷丁香婷婷 | 在线色网址 | 97偷拍视频 | 日韩av成人在线观看 | 国产免费观看视频 | 韩日一区二区三区 | 日韩在线欧美 | 天堂亚洲 | 国产精品免费在线 | 91最新视频 | 在线观看亚洲专区 | 国产精品一卡 | 中文字幕日韩在线观看 | 午夜精品久久久久久久久久久久久 | 爱草在线| 中文字幕 国产精品 | www.日韩av.com| 日韩欧美一区二区三区四区 | 欧美一卡二卡在线观看 | 亚洲视频一区在线观看 | 国产成在线观看免费视频 | 国产精品成人久久久久 | 精品日韩在线 | 亚洲综合在线一区二区 | 日韩在线观看网站 |