データのインポート#

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

See also

Reading and Writing Parquet Files

https://duckdb.org/docs/data/parquet/overview.html

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