ã2026幎çãDuckDBã®å§ãæ¹ â ããŒã«ã«ã§è¶ é«éããŒã¿åæãããå®å šã¬ã€ã
- DuckDBã®ã€ã³ã¹ããŒã«ãšCLIèµ·å
- CSVãParquetãã¡ã€ã«ãžã®çŽæ¥ã¯ãšãª
- SQLiteã»PostgreSQLãšã®éããšäœ¿ãåã
- Python飿ºã®åºæ¬
ã€ã³ã¹ããŒã«æé
# macOS
brew install duckdb
# Pythonçµç±ïŒæãæè»œïŒ
pip install duckdb
# ããŒãžã§ã³ç¢ºèªã»CLIèµ·å
duckdb --version
duckdb # CLIãèµ·åïŒ.quit ã§çµäºïŒ
DuckDBã³ãã³ãã»ã¯ãšãªæ©èŠè¡š
-- CSVãã¡ã€ã«ãçŽæ¥ã¯ãšãª
SELECT * FROM 'data.csv' LIMIT 10;
SELECT COUNT(*), AVG(price) FROM 'sales.csv' WHERE year = 2025;
-- Parquetãã¡ã€ã«ãçŽæ¥ã¯ãšãª
SELECT * FROM 'data.parquet' WHERE category = 'A';
-- URLããããŒã¿ãååŸïŒhttpfsæ¡åŒµïŒ
INSTALL httpfs;
LOAD httpfs;
SELECT * FROM 'https://example.com/data.csv';
-- çµæããã¡ã€ã«ã«ä¿å
COPY (SELECT * FROM 'input.csv') TO 'output.parquet' (FORMAT PARQUET);
COPY (SELECT * FROM 'input.csv') TO 'output.json' (FORMAT JSON);
-- ããŒãã«ãäœæ
CREATE TABLE sales AS SELECT * FROM 'sales.csv';
DESCRIBE sales;
Python飿º
import duckdb
# ã€ã³ã¡ã¢ãªDB
con = duckdb.connect()
# CSVãçŽæ¥ã¯ãšãª
df = con.execute("SELECT * FROM 'data.csv'").df()
# pandasãšã®é£æº
import pandas as pd
df = pd.read_csv('data.csv')
result = con.execute("SELECT category, SUM(amount) FROM df GROUP BY category").df()
print(result)
ããããè©°ãŸããã€ã³ã
Q: SQLiteãšäœãéãã®ïŒ â SQLiteã¯è¡å¿åïŒOLTPåãïŒã§ãããDuckDBã¯åå¿åïŒOLAPåãïŒã§ãã倧éããŒã¿ã®éèšã¯ãšãªã¯DuckDBãå§åçã«é«éã§ãããã¡ã€ã«ãçŽæ¥ã¯ãšãªã§ããç¹ã倧ããªéãã§ãã
Q: è€æ°ããã»ã¹ããåæã¢ã¯ã»ã¹ã§ããïŒ â DuckDBã¯åäžã©ã€ã¿ãŒã®ã¿èš±å¯ããŸããåæçšéïŒ1ããã»ã¹ãããŒã¿ãåŠçïŒã«ã¯åé¡ãããŸããããWebãµãŒããŒã®ãããªå€æ°ã®åææžã蟌ã¿ã«ã¯åããŸããã
Q: S3ã®ãã¡ã€ã«ãçŽæ¥ã¯ãšãªã§ããïŒ
â httpfs æ¡åŒµã䜿ãã°S3ã®CSV/ParquetãçŽæ¥ã¯ãšãªã§ããŸããSET s3_region='ap-northeast-1' ãªã©ã§èªèšŒæ
å ±ãèšå®ããŠãã ããã