この連載では、DuckDBについて学んでいきます。前回の記事はこちらになります。
前回は、CSVファイルの読み込み方法の詳細について学びました。DuckDBではCSVファイルを、ファイルのまま問い合わせたり、URLから直接読み込んだり、テーブルとして保存したりできます。

今回はJSONファイルです。DuckDBでJSONファイルを扱う方法を学びます。
JSONファイルとは
JSON(JavaScript Object Notation)は、データをテキスト形式で表現するためのフォーマットです。キーと値を組み合わせてデータを表現します。また、複数のデータを配列としてまとめることもできます。
[ { "id": 1, "name": "田中", "department": "営業", "salary": 300000 }, { "id": 2, "name": "佐藤", "department": "総務", "salary": 350000 }, { "id": 3, "name": "鈴木", "department": "営業", "salary": 320000 } ]
このような形式であれば、表形式のデータとして扱うことができます。このデータを「employees.json」というファイル名で保存してDuckDBで次のSQLを実行します。
memory D SELECT *
FROM 'employees.json';
┌───────┬─────────┬────────────┬────────┐
│ id │ name │ department │ salary │
│ int64 │ varchar │ varchar │ int64 │
├───────┼─────────┼────────────┼────────┤
│ 1 │ 田中 │ 営業 │ 300000 │
│ 2 │ 佐藤 │ 総務 │ 350000 │
│ 3 │ 鈴木 │ 営業 │ 320000 │
└───────┴─────────┴────────────┴────────┘
入れ子構造のJSONファイル
JSONでは、データを入れ子構造で表現できます。以下のようなデータです。
{ "id": 1, "name": "田中", "department": "営業", "salary": 300000, "address": { "prefecture": "東京都", "city": "新宿区" } }
このデータを「employees2.json」というファイル名で保存して次のSQLを実行します。
memory D SELECT *
FROM 'employees2.json';
┌───────┬─────────┬────────────┬────────┬──────────────────────────────────────────┐
│ id │ name │ department │ salary │ address │
│ int64 │ varchar │ varchar │ int64 │ struct(prefecture varchar, city varchar) │
├───────┼─────────┼────────────┼────────┼──────────────────────────────────────────┤
│ 1 │ 田中 │ 営業 │ 300000 │ {'prefecture': 東京都, 'city': 新宿区} │
└───────┴─────────┴────────────┴────────┴──────────────────────────────────────────┘
今回の例では、addressのような入れ子のオブジェクトが、DuckDBではSTRUCT型として認識されます。struct型は、異なるデータ型の複数のフィールド(キーと値のペア)を1つのまとまったデータとして保持する複合データ型(構造体・レコード)です。
JSONのパス
入れ子になったJSONの値を取り出すには、JSONのパス(JSONPath)を指定します。JSONPathは、JSONデータの中から特定の要素を指定するための記法です。キーを指定したり、配列のインデックスを指定したりすることで、目的のデータを参照できます。以下の記法をサポートしています。
- ルート要素(\$): JSONデータ全体の起点を表します。JSONPathでは、通常、$からパスを指定します。
- ドット記法(.): プロパティ(キー)を指定します(例: $.store.name)。
- ブラケット記法 ([]): プロパティ名や、配列のインデックス(0から始まる番号)を指定します(例: $.store.book[0])。
- ワイルドカード (*): すべての要素やプロパティを選択します(例: $.store.book[*])。
具体的なアクセス方法は、次回ご紹介します。
次回もJSONファイル
いかがでしょうか。JSONファイルは階層構造のデータも表せるところが便利ですね。次回もJSONファイルです。具体的なアクセス例を見ていきましょう。お楽しみに!!





