データのインポート#
CSVファイル#
import duckdb
duckdb.sql(
"COPY (SELECT database_name, database_oid FROM duckdb_schemas() WHERE database_oid = 1146) TO 'data/sample1.csv'"
)
duckdb.sql(
"COPY (SELECT database_name, database_oid FROM duckdb_schemas() WHERE database_oid = 0) TO 'data/sample2.csv'"
)
COPY(
SELECT
database_name,
database_oid
FROM
duckdb_schemas()
WHERE
database_oid = 1146
) TO 'data/sample1.csv'
;
COPY(
SELECT
database_name,
database_oid
FROM
duckdb_schemas()
WHERE
database_oid = 0
) TO 'data/sample2.csv'
;
%cat data/sample*.csv
database_name,database_oid
database_name,database_oid
system,0
system,0
system,0
read_csv によるCSVファイルの読み込み
duckdb.read_csv("data/sample1.csv")
SELECT
*
FROM
read_csv("data/sample1.csv")
;
┌───────────────┬──────────────┐
│ database_name │ database_oid │
│ varchar │ varchar │
├───────────────┴──────────────┤
│ 0 rows │
└──────────────────────────────┘
複数ファイルの読み込み
duckdb.read_csv("data/sample*.csv")
SELECT
*
FROM
read_csv("data/sample*.csv")
;
┌───────────────┬──────────────┐
│ database_name │ database_oid │
│ varchar │ varchar │
├───────────────┼──────────────┤
│ system │ 0 │
│ system │ 0 │
│ system │ 0 │
└───────────────┴──────────────┘
オプションの指定
duckdb.read_csv("data/sample1.csv", header=False, sep=",")
SELECT
*
FROM
read_csv(
"data/sample1.csv",
header = False,
sep = ","
)
;
┌───────────────┬──────────────┐
│ column0 │ column1 │
│ varchar │ varchar │
├───────────────┼──────────────┤
│ database_name │ database_oid │
└───────────────┴──────────────┘
データ型の上書き
duckdb.read_csv(
"data/sample1.csv",
dtype=[str, float],
)
┌───────────────┬──────────────┐
│ database_name │ database_oid │
│ varchar │ double │
├───────────────┴──────────────┤
│ 0 rows │
└──────────────────────────────┘
duckdb.read_csv(
"data/sample1.csv",
dtype={"database_oid": float},
)
┌───────────────┬──────────────┐
│ database_name │ database_oid │
│ varchar │ double │
├───────────────┴──────────────┤
│ 0 rows │
└──────────────────────────────┘
SQL文による read_csv の記述
duckdb.sql("SELECT * FROM 'data/sample1.csv'")
┌───────────────┬──────────────┐
│ database_name │ database_oid │
│ varchar │ varchar │
├───────────────┴──────────────┤
│ 0 rows │
└──────────────────────────────┘
duckdb.sql("SELECT * FROM read_csv('data/sample1.csv')")
┌───────────────┬──────────────┐
│ database_name │ database_oid │
│ varchar │ varchar │
├───────────────┴──────────────┤
│ 0 rows │
└──────────────────────────────┘
Parquetファイル#
Apache Parquet プロジェクトによる開発
表形式データを効率よく読み書き
高い圧縮率
多くのプログラミング言語に対応
HDFS で動作
HttpFS に対応
duckdb.read_parquet によるParquetファイルの読み込み
See also
https エンドポイントへの接続
duckdb.read_parquet(
"https://raw.githubusercontent.com/plotly/datasets/refs/heads/master/2015_flights.parquet"
)
SELECT
*
FROM
read_parquet("https://raw.githubusercontent.com/plotly/datasets/refs/heads/master/2015_flights.parquet")
;
┌─────────────────┬───────────────┬──────────┬─────────────────────┐
│ DEPARTURE_DELAY │ ARRIVAL_DELAY │ DISTANCE │ SCHEDULED_DEPARTURE │
│ double │ double │ int64 │ double │
├─────────────────┼───────────────┼──────────┼─────────────────────┤
│ -11.0 │ -22.0 │ 1448 │ 0.08333333333333333 │
│ -8.0 │ -9.0 │ 2330 │ 0.16666666666666666 │
│ -2.0 │ 5.0 │ 2296 │ 0.3333333333333333 │
│ -5.0 │ -9.0 │ 2342 │ 0.3333333333333333 │
│ -1.0 │ -21.0 │ 1448 │ 0.4166666666666667 │
│ -5.0 │ 8.0 │ 1589 │ 0.4166666666666667 │
│ -6.0 │ -17.0 │ 1299 │ 0.4166666666666667 │
│ 14.0 │ -10.0 │ 2125 │ 0.5 │
│ -11.0 │ -13.0 │ 1464 │ 0.5 │
│ 3.0 │ -15.0 │ 1747 │ 0.5 │
│ · │ · │ · │ · │
│ · │ · │ · │ · │
│ · │ · │ · │ · │
│ -1.0 │ -10.0 │ 895 │ 17.083333333333332 │
│ 17.0 │ 28.0 │ 602 │ 17.083333333333332 │
│ -3.0 │ 15.0 │ 2556 │ 17.083333333333332 │
│ 98.0 │ 133.0 │ 164 │ 17.083333333333332 │
│ 5.0 │ -5.0 │ 473 │ 17.083333333333332 │
│ 11.0 │ 17.0 │ 100 │ 17.083333333333332 │
│ -12.0 │ -32.0 │ 147 │ 17.083333333333332 │
│ 16.0 │ 26.0 │ 135 │ 17.083333333333332 │
│ 175.0 │ 196.0 │ 594 │ 17.083333333333332 │
│ 21.0 │ 29.0 │ 312 │ 17.083333333333332 │
├─────────────────┴───────────────┴──────────┴─────────────────────┤
│ ? rows (>9999 rows, 20 shown) 4 columns │
└──────────────────────────────────────────────────────────────────┘
SQL文による read_parquet の記述
duckdb.sql(
"SELECT * FROM 'https://raw.githubusercontent.com/plotly/datasets/refs/heads/master/2015_flights.parquet'"
)
┌─────────────────┬───────────────┬──────────┬─────────────────────┐
│ DEPARTURE_DELAY │ ARRIVAL_DELAY │ DISTANCE │ SCHEDULED_DEPARTURE │
│ double │ double │ int64 │ double │
├─────────────────┼───────────────┼──────────┼─────────────────────┤
│ -11.0 │ -22.0 │ 1448 │ 0.08333333333333333 │
│ -8.0 │ -9.0 │ 2330 │ 0.16666666666666666 │
│ -2.0 │ 5.0 │ 2296 │ 0.3333333333333333 │
│ -5.0 │ -9.0 │ 2342 │ 0.3333333333333333 │
│ -1.0 │ -21.0 │ 1448 │ 0.4166666666666667 │
│ -5.0 │ 8.0 │ 1589 │ 0.4166666666666667 │
│ -6.0 │ -17.0 │ 1299 │ 0.4166666666666667 │
│ 14.0 │ -10.0 │ 2125 │ 0.5 │
│ -11.0 │ -13.0 │ 1464 │ 0.5 │
│ 3.0 │ -15.0 │ 1747 │ 0.5 │
│ · │ · │ · │ · │
│ · │ · │ · │ · │
│ · │ · │ · │ · │
│ -1.0 │ -10.0 │ 895 │ 17.083333333333332 │
│ 17.0 │ 28.0 │ 602 │ 17.083333333333332 │
│ -3.0 │ 15.0 │ 2556 │ 17.083333333333332 │
│ 98.0 │ 133.0 │ 164 │ 17.083333333333332 │
│ 5.0 │ -5.0 │ 473 │ 17.083333333333332 │
│ 11.0 │ 17.0 │ 100 │ 17.083333333333332 │
│ -12.0 │ -32.0 │ 147 │ 17.083333333333332 │
│ 16.0 │ 26.0 │ 135 │ 17.083333333333332 │
│ 175.0 │ 196.0 │ 594 │ 17.083333333333332 │
│ 21.0 │ 29.0 │ 312 │ 17.083333333333332 │
├─────────────────┴───────────────┴──────────┴─────────────────────┤
│ ? rows (>9999 rows, 20 shown) 4 columns │
└──────────────────────────────────────────────────────────────────┘
duckdb.sql(
"SELECT * FROM read_parquet('https://raw.githubusercontent.com/plotly/datasets/refs/heads/master/2015_flights.parquet')"
)
┌─────────────────┬───────────────┬──────────┬─────────────────────┐
│ DEPARTURE_DELAY │ ARRIVAL_DELAY │ DISTANCE │ SCHEDULED_DEPARTURE │
│ double │ double │ int64 │ double │
├─────────────────┼───────────────┼──────────┼─────────────────────┤
│ -11.0 │ -22.0 │ 1448 │ 0.08333333333333333 │
│ -8.0 │ -9.0 │ 2330 │ 0.16666666666666666 │
│ -2.0 │ 5.0 │ 2296 │ 0.3333333333333333 │
│ -5.0 │ -9.0 │ 2342 │ 0.3333333333333333 │
│ -1.0 │ -21.0 │ 1448 │ 0.4166666666666667 │
│ -5.0 │ 8.0 │ 1589 │ 0.4166666666666667 │
│ -6.0 │ -17.0 │ 1299 │ 0.4166666666666667 │
│ 14.0 │ -10.0 │ 2125 │ 0.5 │
│ -11.0 │ -13.0 │ 1464 │ 0.5 │
│ 3.0 │ -15.0 │ 1747 │ 0.5 │
│ · │ · │ · │ · │
│ · │ · │ · │ · │
│ · │ · │ · │ · │
│ -1.0 │ -10.0 │ 895 │ 17.083333333333332 │
│ 17.0 │ 28.0 │ 602 │ 17.083333333333332 │
│ -3.0 │ 15.0 │ 2556 │ 17.083333333333332 │
│ 98.0 │ 133.0 │ 164 │ 17.083333333333332 │
│ 5.0 │ -5.0 │ 473 │ 17.083333333333332 │
│ 11.0 │ 17.0 │ 100 │ 17.083333333333332 │
│ -12.0 │ -32.0 │ 147 │ 17.083333333333332 │
│ 16.0 │ 26.0 │ 135 │ 17.083333333333332 │
│ 175.0 │ 196.0 │ 594 │ 17.083333333333332 │
│ 21.0 │ 29.0 │ 312 │ 17.083333333333332 │
├─────────────────┴───────────────┴──────────┴─────────────────────┤
│ ? rows (>9999 rows, 20 shown) 4 columns │
└──────────────────────────────────────────────────────────────────┘
Parquet Metadata
Parquetファイルに含まれるメタデータを照会
各カラムの統計情報など、Parquetファイルのさまざまな内部情報を確認できる
duckdb.sql(
"SELECT * FROM parquet_metadata('https://raw.githubusercontent.com/plotly/datasets/refs/heads/master/2015_flights.parquet')"
)
SELECT
*
FROM
parquet_metadata("https://raw.githubusercontent.com/plotly/datasets/refs/heads/master/2015_flights.parquet")
;
┌──────────────────────────────────────────────────────────────────────────────────────────┬──────────────┬────────────────────┬───────────────────────┬─────────────────┬───────────┬─────────────┬────────────┬─────────────────────┬─────────┬──────────────────────┬────────────────────┬──────────────────┬──────────────────────┬──────────────────────┬────────────────────┬─────────────┬──────────────────────────────┬───────────────────┬────────────────────────┬──────────────────┬───────────────────────┬─────────────────────────┬────────────────────┐
│ file_name │ row_group_id │ row_group_num_rows │ row_group_num_columns │ row_group_bytes │ column_id │ file_offset │ num_values │ path_in_schema │ type │ stats_min │ stats_max │ stats_null_count │ stats_distinct_count │ stats_min_value │ stats_max_value │ compression │ encodings │ index_page_offset │ dictionary_page_offset │ data_page_offset │ total_compressed_size │ total_uncompressed_size │ key_value_metadata │
│ varchar │ int64 │ int64 │ int64 │ int64 │ int64 │ int64 │ int64 │ varchar │ varchar │ varchar │ varchar │ int64 │ int64 │ varchar │ varchar │ varchar │ varchar │ int64 │ int64 │ int64 │ int64 │ int64 │ map(blob, blob) │
├──────────────────────────────────────────────────────────────────────────────────────────┼──────────────┼────────────────────┼───────────────────────┼─────────────────┼───────────┼─────────────┼────────────┼─────────────────────┼─────────┼──────────────────────┼────────────────────┼──────────────────┼──────────────────────┼──────────────────────┼────────────────────┼─────────────┼──────────────────────────────┼───────────────────┼────────────────────────┼──────────────────┼───────────────────────┼─────────────────────────┼────────────────────┤
│ https://raw.githubusercontent.com/plotly/datasets/refs/heads/master/2015_flights.parquet │ 0 │ 5819079 │ 4 │ 25234719 │ 0 │ NULL │ 5819079 │ DEPARTURE_DELAY │ DOUBLE │ -82.0 │ 1988.0 │ 86153 │ NULL │ -82.0 │ 1988.0 │ SNAPPY │ PLAIN_DICTIONARY, PLAIN, RLE │ NULL │ 4 │ 4933 │ 7739950 │ 7838531 │ {} │
│ https://raw.githubusercontent.com/plotly/datasets/refs/heads/master/2015_flights.parquet │ 0 │ 5819079 │ 4 │ 25234719 │ 1 │ NULL │ 5819079 │ ARRIVAL_DELAY │ DOUBLE │ -87.0 │ 1971.0 │ 105071 │ NULL │ -87.0 │ 1971.0 │ SNAPPY │ PLAIN_DICTIONARY, PLAIN, RLE │ NULL │ 7740055 │ 7745079 │ 7869986 │ 7957096 │ {} │
│ https://raw.githubusercontent.com/plotly/datasets/refs/heads/master/2015_flights.parquet │ 0 │ 5819079 │ 4 │ 25234719 │ 2 │ NULL │ 5819079 │ DISTANCE │ INT64 │ 21 │ 4983 │ 0 │ NULL │ 21 │ 4983 │ SNAPPY │ PLAIN_DICTIONARY, PLAIN, RLE │ NULL │ 15610145 │ 15615658 │ 8019349 │ 8024390 │ {} │
│ https://raw.githubusercontent.com/plotly/datasets/refs/heads/master/2015_flights.parquet │ 0 │ 5819079 │ 4 │ 25234719 │ 3 │ NULL │ 5819079 │ SCHEDULED_DEPARTURE │ DOUBLE │ 0.016666666666666666 │ 23.983333333333334 │ 0 │ NULL │ 0.016666666666666666 │ 23.983333333333334 │ SNAPPY │ PLAIN_DICTIONARY, PLAIN, RLE │ NULL │ 23629591 │ 23634999 │ 1605434 │ 2463454 │ {} │
└──────────────────────────────────────────────────────────────────────────────────────────┴──────────────┴────────────────────┴───────────────────────┴─────────────────┴───────────┴─────────────┴────────────┴─────────────────────┴─────────┴──────────────────────┴────────────────────┴──────────────────┴──────────────────────┴──────────────────────┴────────────────────┴─────────────┴──────────────────────────────┴───────────────────┴────────────────────────┴──────────────────┴───────────────────────┴─────────────────────────┴────────────────────┘
JSONファイル#
duckdb.read_json によるJSONファイルの読み込み
duckdb.read_json(
"https://github.com/plotly/datasets/raw/refs/heads/master/iris_data.json"
)
SELECT
*
FROM
read_json("https://github.com/plotly/datasets/raw/refs/heads/master/iris_data.json")
;
┌──────────────┬─────────────┬──────────────┬─────────────┬────────────────┐
│ sepal length │ sepal width │ petal length │ petal width │ class │
│ double │ double │ double │ double │ varchar │
├──────────────┼─────────────┼──────────────┼─────────────┼────────────────┤
│ 5.1 │ 3.5 │ 1.4 │ 0.2 │ Iris-setosa │
│ 4.9 │ 3.0 │ 1.4 │ 0.2 │ Iris-setosa │
│ 4.7 │ 3.2 │ 1.3 │ 0.2 │ Iris-setosa │
│ 4.6 │ 3.1 │ 1.5 │ 0.2 │ Iris-setosa │
│ 5.0 │ 3.6 │ 1.4 │ 0.2 │ Iris-setosa │
│ 5.4 │ 3.9 │ 1.7 │ 0.4 │ Iris-setosa │
│ 4.6 │ 3.4 │ 1.4 │ 0.3 │ Iris-setosa │
│ 5.0 │ 3.4 │ 1.5 │ 0.2 │ Iris-setosa │
│ 4.4 │ 2.9 │ 1.4 │ 0.2 │ Iris-setosa │
│ 4.9 │ 3.1 │ 1.5 │ 0.1 │ Iris-setosa │
│ · │ · │ · │ · │ · │
│ · │ · │ · │ · │ · │
│ · │ · │ · │ · │ · │
│ 6.7 │ 3.1 │ 5.6 │ 2.4 │ Iris-virginica │
│ 6.9 │ 3.1 │ 5.1 │ 2.3 │ Iris-virginica │
│ 5.8 │ 2.7 │ 5.1 │ 1.9 │ Iris-virginica │
│ 6.8 │ 3.2 │ 5.9 │ 2.3 │ Iris-virginica │
│ 6.7 │ 3.3 │ 5.7 │ 2.5 │ Iris-virginica │
│ 6.7 │ 3.0 │ 5.2 │ 2.3 │ Iris-virginica │
│ 6.3 │ 2.5 │ 5.0 │ 1.9 │ Iris-virginica │
│ 6.5 │ 3.0 │ 5.2 │ 2.0 │ Iris-virginica │
│ 6.2 │ 3.4 │ 5.4 │ 2.3 │ Iris-virginica │
│ 5.9 │ 3.0 │ 5.1 │ 1.8 │ Iris-virginica │
├──────────────┴─────────────┴──────────────┴─────────────┴────────────────┤
│ 150 rows (20 shown) 5 columns │
└──────────────────────────────────────────────────────────────────────────┘
SQL文による read_json の記述
duckdb.sql(
"SELECT * FROM 'https://github.com/plotly/datasets/raw/refs/heads/master/iris_data.json'"
)
┌──────────────┬─────────────┬──────────────┬─────────────┬────────────────┐
│ sepal length │ sepal width │ petal length │ petal width │ class │
│ double │ double │ double │ double │ varchar │
├──────────────┼─────────────┼──────────────┼─────────────┼────────────────┤
│ 5.1 │ 3.5 │ 1.4 │ 0.2 │ Iris-setosa │
│ 4.9 │ 3.0 │ 1.4 │ 0.2 │ Iris-setosa │
│ 4.7 │ 3.2 │ 1.3 │ 0.2 │ Iris-setosa │
│ 4.6 │ 3.1 │ 1.5 │ 0.2 │ Iris-setosa │
│ 5.0 │ 3.6 │ 1.4 │ 0.2 │ Iris-setosa │
│ 5.4 │ 3.9 │ 1.7 │ 0.4 │ Iris-setosa │
│ 4.6 │ 3.4 │ 1.4 │ 0.3 │ Iris-setosa │
│ 5.0 │ 3.4 │ 1.5 │ 0.2 │ Iris-setosa │
│ 4.4 │ 2.9 │ 1.4 │ 0.2 │ Iris-setosa │
│ 4.9 │ 3.1 │ 1.5 │ 0.1 │ Iris-setosa │
│ · │ · │ · │ · │ · │
│ · │ · │ · │ · │ · │
│ · │ · │ · │ · │ · │
│ 6.7 │ 3.1 │ 5.6 │ 2.4 │ Iris-virginica │
│ 6.9 │ 3.1 │ 5.1 │ 2.3 │ Iris-virginica │
│ 5.8 │ 2.7 │ 5.1 │ 1.9 │ Iris-virginica │
│ 6.8 │ 3.2 │ 5.9 │ 2.3 │ Iris-virginica │
│ 6.7 │ 3.3 │ 5.7 │ 2.5 │ Iris-virginica │
│ 6.7 │ 3.0 │ 5.2 │ 2.3 │ Iris-virginica │
│ 6.3 │ 2.5 │ 5.0 │ 1.9 │ Iris-virginica │
│ 6.5 │ 3.0 │ 5.2 │ 2.0 │ Iris-virginica │
│ 6.2 │ 3.4 │ 5.4 │ 2.3 │ Iris-virginica │
│ 5.9 │ 3.0 │ 5.1 │ 1.8 │ Iris-virginica │
├──────────────┴─────────────┴──────────────┴─────────────┴────────────────┤
│ 150 rows (20 shown) 5 columns │
└──────────────────────────────────────────────────────────────────────────┘
duckdb.sql(
"SELECT * FROM read_json('https://github.com/plotly/datasets/raw/refs/heads/master/iris_data.json')"
)
┌──────────────┬─────────────┬──────────────┬─────────────┬────────────────┐
│ sepal length │ sepal width │ petal length │ petal width │ class │
│ double │ double │ double │ double │ varchar │
├──────────────┼─────────────┼──────────────┼─────────────┼────────────────┤
│ 5.1 │ 3.5 │ 1.4 │ 0.2 │ Iris-setosa │
│ 4.9 │ 3.0 │ 1.4 │ 0.2 │ Iris-setosa │
│ 4.7 │ 3.2 │ 1.3 │ 0.2 │ Iris-setosa │
│ 4.6 │ 3.1 │ 1.5 │ 0.2 │ Iris-setosa │
│ 5.0 │ 3.6 │ 1.4 │ 0.2 │ Iris-setosa │
│ 5.4 │ 3.9 │ 1.7 │ 0.4 │ Iris-setosa │
│ 4.6 │ 3.4 │ 1.4 │ 0.3 │ Iris-setosa │
│ 5.0 │ 3.4 │ 1.5 │ 0.2 │ Iris-setosa │
│ 4.4 │ 2.9 │ 1.4 │ 0.2 │ Iris-setosa │
│ 4.9 │ 3.1 │ 1.5 │ 0.1 │ Iris-setosa │
│ · │ · │ · │ · │ · │
│ · │ · │ · │ · │ · │
│ · │ · │ · │ · │ · │
│ 6.7 │ 3.1 │ 5.6 │ 2.4 │ Iris-virginica │
│ 6.9 │ 3.1 │ 5.1 │ 2.3 │ Iris-virginica │
│ 5.8 │ 2.7 │ 5.1 │ 1.9 │ Iris-virginica │
│ 6.8 │ 3.2 │ 5.9 │ 2.3 │ Iris-virginica │
│ 6.7 │ 3.3 │ 5.7 │ 2.5 │ Iris-virginica │
│ 6.7 │ 3.0 │ 5.2 │ 2.3 │ Iris-virginica │
│ 6.3 │ 2.5 │ 5.0 │ 1.9 │ Iris-virginica │
│ 6.5 │ 3.0 │ 5.2 │ 2.0 │ Iris-virginica │
│ 6.2 │ 3.4 │ 5.4 │ 2.3 │ Iris-virginica │
│ 5.9 │ 3.0 │ 5.1 │ 1.8 │ Iris-virginica │
├──────────────┴─────────────┴──────────────┴─────────────┴────────────────┤
│ 150 rows (20 shown) 5 columns │
└──────────────────────────────────────────────────────────────────────────┘
pandas DataFrameへのアクセス#
import pandas as pd
df = pd.read_csv("data/sample1.csv")
duckdb.sql("SELECT * FROM df")
┌───────────────┬──────────────┐
│ database_name │ database_oid │
│ int32 │ int32 │
├───────────────┴──────────────┤
│ 0 rows │
└──────────────────────────────┘
Arrowオブジェクトへのアクセス#
import pyarrow as pa
pa_table = pa.table([pa.array([1, 2]), pa.array([10, 20])], names=["col1", "col2"])
duckdb.sql("SELECT * FROM pa_table")
┌───────┬───────┐
│ col1 │ col2 │
│ int64 │ int64 │
├───────┼───────┤
│ 1 │ 10 │
│ 2 │ 20 │
└───────┴───────┘