自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

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

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

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

DuckDB 的適用場景

1.實(shí)時(shí)分析

在追求速度和響應(yīng)能力的實(shí)時(shí)分析領(lǐng)域,DuckDB 以其高性能和低延遲的特性成為不可或缺的工具。無論是監(jiān)控系統(tǒng)、實(shí)時(shí)報(bào)表還是預(yù)警系統(tǒng),DuckDB 都能快速響應(yīng)大量的數(shù)據(jù)查詢請求,提供準(zhǔn)確而及時(shí)的分析結(jié)果。這使得企業(yè)能夠?qū)崟r(shí)掌握業(yè)務(wù)動(dòng)態(tài),做出快速而明智的決策。

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

2.數(shù)據(jù)倉庫

DuckDB 同樣適用于構(gòu)建和管理數(shù)據(jù)倉庫系統(tǒng)。作為輕量級的數(shù)據(jù)倉庫解決方案,它能夠輕松應(yīng)對數(shù)據(jù)整合、清洗和轉(zhuǎn)換等復(fù)雜任務(wù)。通過 ETL 過程,DuckDB 能夠?qū)碜圆煌瑪?shù)據(jù)源的數(shù)據(jù)整合到一起,形成統(tǒng)一的數(shù)據(jù)視圖。然后,用戶可以利用其強(qiáng)大的查詢和分析能力,深入挖掘數(shù)據(jù)的價(jià)值,發(fā)現(xiàn)潛在的商業(yè)機(jī)會。

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

3.嵌入式應(yīng)用

DuckDB 的嵌入式特性使其成為嵌入式應(yīng)用的理想選擇。無論是物聯(lián)網(wǎng)設(shè)備還是移動(dòng)應(yīng)用程序,都可以通過集成 DuckDB 實(shí)現(xiàn)本地?cái)?shù)據(jù)分析能力。這意味著設(shè)備或應(yīng)用程序可以直接在本地處理和分析數(shù)據(jù),無需依賴遠(yuǎn)程服務(wù)器或云端資源。

在物聯(lián)網(wǎng)設(shè)備中,DuckDB 可以幫助實(shí)現(xiàn)實(shí)時(shí)的數(shù)據(jù)采集和分析,提升設(shè)備的智能化水平。在移動(dòng)應(yīng)用程序中,它可以用于存儲和分析用戶數(shù)據(jù),提供個(gè)性化的服務(wù)和推薦,提升用戶體驗(yàn)。

4.大數(shù)據(jù)預(yù)處理

大數(shù)據(jù)預(yù)處理是數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)流程中不可或缺的一環(huán)。在這一環(huán)節(jié)中,DuckDB 同樣可以發(fā)揮重要作用。它能夠高效地對數(shù)據(jù)進(jìn)行清洗、轉(zhuǎn)換和聚合等操作,為后續(xù)的機(jī)器學(xué)習(xí)或數(shù)據(jù)挖掘任務(wù)提供高質(zhì)量的輸入數(shù)據(jù)。

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

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

安裝及簡單使用

# MacOS 安裝
$ brew install duckdb


# Python 安裝
pip install duckdb


# NodeJS 安裝
npm install duckdb


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

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

(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 中的一個(gè)示例,從 S3 存儲上面下載了一個(gè)數(shù)據(jù)文件,并導(dǎo)入到 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 │
└────────────────┘
-- 或者執(zhí)行 .tables 也可以查看有哪些表
D .tables
train_services

如何查看表結(jié)構(gòu)呢?

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 條數(shù)據(jù):

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 │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

還可以設(shè)置輸出樣式,默認(rèn)是 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    |                     |                     |
+------------+------------+-----------+--------------+--------------+----------------------+---------------------+---------------------+

還可以獲取命令的幫助,進(jìn)入 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

導(dǎo)出CSV文件

可以輕松地把數(shù)據(jù)導(dǎo)出到 CSV 文件:

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


-- 查看文件前 10 行內(nèi)容
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

查詢的數(shù)據(jù)也可以導(dǎo)出到 CSV 文件:

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

導(dǎo)入CSV文件

導(dǎo)入 CSV 文件有多種方式:

-- 通過 read_csv() 函數(shù)直接讀取 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() 函數(shù)
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 │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

     

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

連接或創(chuàng)建數(shù)據(jù)庫

前面的操作都是在內(nèi)存中進(jìn)行的,也就意味著當(dāng)我們退出當(dāng)前的 DuckDB 會話時(shí),數(shù)據(jù)也會隨之釋放。DuckDB 也支持持久模式運(yùn)行,這樣數(shù)據(jù)可以存放在硬盤上面。我們可以看下 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 程序后面提供一個(gè) FILENAME,這個(gè) FILENAME 就是一個(gè)數(shù)據(jù)庫,如果存在就打開(連接)該庫,如果該庫不存在則創(chuàng)建。

接下來我們演示一下,首先我們準(zhǔn)備一些測試數(shù)據(jù):

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

下載完成數(shù)據(jù)之后,我們通過 DuckDB 創(chuàng)建一個(gè)空的庫,然后導(dǎo)入該示例數(shù)據(jù)。如下:

$ duckdb railway.db

[!tip]

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

進(jìn)入數(shù)據(jù)庫后,我們導(dǎo)入前面已下載的壓縮數(shù)據(jù):

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


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


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

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

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

查詢利用了 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) │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
  • 查詢創(chuàng)建一個(gè)名為 services 的表,并使用 CSV 讀取器的結(jié)果寫入該表。使用 `CREATE TABLE ...AS` 語句。

我們看看 services 表里面有多少行數(shù)據(jù):

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     │
└────────────────┘

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

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

其他數(shù)據(jù)庫集成

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

1.與 MySQL 集成

要直接在 MySQL 數(shù)據(jù)庫上運(yùn)行查詢,需要 mysql 擴(kuò)展。可以使用 INSTALL SQL 命令安裝擴(kuò)展。只需要運(yùn)行一次即可:

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

要想使用 mysql 擴(kuò)展,需要使用 LOAD SQL 命令:

D LOAD mysql;

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

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

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

圖片圖片

接下來是一個(gè)實(shí)際的例子,讓我們連接到本地的一個(gè) MySQL 數(shù)據(jù)庫:

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


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


-- 查詢一下 country 表里面的數(shù)據(jù)
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 │
└─────────────────────────────────────────────────────────────────────────────┘

由于我們連接時(shí)指定了 READ_ONLY 選項(xiàng),那么我們是以只讀模式連接過來的,無法進(jìn)行增刪改的操作。如下:

-- 創(chuàng)建一張表
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!


-- 刪除一條數(shù)據(jù)
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]

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

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

2.與 PostgreSQL 集成

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

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


D LOAD postgres;

安裝 postgres 擴(kuò)展后,可以使用 postgres_scan 函數(shù)從 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” 函數(shù)的第一個(gè)參數(shù)是 [PostgreSQL 連接字符串](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING),

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

圖片圖片

接下來我們連接到本地的一個(gè) PostgreSQL 數(shù)據(jù)庫上面進(jìn)行一個(gè)查詢:

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 命令連接整個(gè)數(shù)據(jù)庫。這允許我們像查詢常規(guī)數(shù)據(jù)庫一樣查詢存儲在 PostgreSQL 數(shù)據(jù)庫中的所有表。語法如下:

-- 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;

一個(gè)實(shí)際的例子:

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


-- 查詢數(shù)據(jù)
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     │
└───────┴───────────────────────┴──────────────────────────────────┘

由于我們在映射數(shù)據(jù)庫時(shí)并沒有使用 READ_ONLY 選項(xiàng),因此可以對 pg_forum_db 進(jìn)行讀寫操作。如下:

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     │         │         │         │
└─────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┘


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


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


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


-- 刪除該數(shù)據(jù)
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"?

可以檢查下我們目前都連接了哪些數(shù)據(jù)庫:

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

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

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

擴(kuò)展支持

一個(gè)產(chǎn)品強(qiáng)或系統(tǒng)不強(qiáng),關(guān)鍵還是要看下擴(kuò)展多不多。正所謂:“功能不夠,擴(kuò)展來湊”。我們看下缺省狀態(tài)下 DuckDB 支持的擴(kuò)展:

不同的 DuckDB 客戶端都附帶了一組不同的擴(kuò)展。我們在下表中進(jìn)行一個(gè)比對:

圖片圖片

關(guān)于官方提供的擴(kuò)展,可以參閱官方文檔:https://duckdb.org/docs/extensions/official_extensions。

可以查看當(dāng)前 DuckDB 已安裝的擴(kuò)展:

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 為例進(jìn)行一個(gè)演示。代碼如下:

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)
}

接下來我們進(jìn)行編譯:

$ 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

我們運(yùn)行一下代碼:

$ ./main 
id: 42, name: John

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

總結(jié)

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

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

如有相關(guān)問題,請?jiān)谖恼潞竺娼o小編留言,小編安排作者第一時(shí)間和您聯(lián)系,為您答疑解惑。

責(zé)任編輯:武曉燕 來源: 新鈦云服
相關(guān)推薦

2023-03-29 08:26:06

2022-02-23 08:41:58

NATIPv4IPv6

2022-08-01 07:57:03

數(shù)組操作內(nèi)存

2021-08-27 07:06:10

IOJava抽象

2024-02-20 21:34:16

循環(huán)GolangGo

2023-08-04 08:20:56

DockerfileDocker工具

2022-05-24 08:21:16

數(shù)據(jù)安全API

2023-08-10 08:28:46

網(wǎng)絡(luò)編程通信

2023-09-10 21:42:31

2023-06-30 08:18:51

敏捷開發(fā)模式

2024-09-27 09:56:43

2022-05-26 00:19:29

通信信息5G

2022-02-14 07:03:31

網(wǎng)站安全MFA

2022-06-26 09:40:55

Django框架服務(wù)

2022-10-28 07:27:17

Netty異步Future

2023-04-26 07:30:00

promptUI非結(jié)構(gòu)化

2022-04-06 08:23:57

指針函數(shù)代碼

2023-12-28 09:55:08

隊(duì)列數(shù)據(jù)結(jié)構(gòu)存儲

2022-11-12 12:33:38

CSS預(yù)處理器Sass

2024-02-26 00:00:00

Go性能工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號