parquet データをduckDBで読んでみる

# この記事について
- この記事は[datatech-jp Advent Calendar 2024](https://qiita.com/advent-calendar/2024/datatech-jp)の12月14日分として記載しています

# 背景
- オブジェクトストレージ上に格納されたparquet形式のファイル群をデータソースとするデータレイクハウス（watsonx.data）の環境構築に際して、Create Tableの際にそのデータファイルのメタデータ（データ列名や型など）を確認する必要がありました
- [この記事](https://qiita.com/Shumpei_Kubo/items/c52ef47b408c5c71ee31#%E3%83%87%E3%83%A2%E3%81%AE%E8%AA%AC%E6%98%8E)の、「4.IBM Cloud Object Storage」の箇所(下図ご参照)

![スクリーンショット 2024-12-05 13.01.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295123/793c48b4-338f-5786-37b0-193d243209e7.png)

- 手元にparquet形式のデータはあるが、その中身はバイナリ形式であるため、そのままでは内容を確認できませんでした

# parquet データフォーマットとは

- 列志向のデータフォーマットです
- バイナリ形式のファイルなので、そのままでは読めません

- https://en.wikipedia.org/wiki/Apache_Parquet
- https://zenn.dev/yuto_mo/articles/fad63e2994fbb4

# duckDB とは

- オープンソースの列志向データベースです
- parquet 形式に対応しています
- https://duckdb.org/
- 今回使ったクライアントとしてのコマンドラインは以下です
- https://duckdb.org/docs/api/cli/overview.html

- こちらをMACにインストールして、MAC上にダウンロードしたparquetファイルを読んでみます

# データファイル（*.parquet）の読み方

- 手元のpaquet形式のファイルを確認
```
shumpei.kubo@ShumpeinoMacBook-Pro Downloads % ls -ltra | grep parquet                                           
-rw-r--r--@    1 shumpei.kubo  staff     75558  6  2  2023 13297ee9-aca9-4912-8ff6-befb37041382.parquet
-rw-r--r--@    1 shumpei.kubo  staff    132088  4 15  2024 aircraft(1).parquet
-rw-r--r--@    1 shumpei.kubo  staff      2559  8  6 19:04 ORDER04.6ce8572f-d3b4-4a06-8de2-994d99b82291.parquet
-rw-r--r--@    1 shumpei.kubo  staff      2555  8  6 19:25 dstest.f1bf9f7c-e3b6-4318-903c-03e549e2e9c7.parquet
-rw-r--r--@    1 shumpei.kubo  staff      2555  8  7 02:28 order_table0807_1.9c3f0f67-a871-4bf7-a8da-40aaac639d4e.parquet
-rw-r--r--@    1 shumpei.kubo  staff      2554  8  7 11:22 order_table_p0807.parquet
-rw-r--r--@    1 shumpei.kubo  staff     97334 10 22 16:35 sdc1729581708923.parquet
-rw-r--r--@    1 shumpei.kubo  staff     61661 10 31 17:25 returned_file_and_reason.parquet
-rw-r--r--@    1 shumpei.kubo  staff     97334 11 12 10:28 sdc-1729581708923-1-000.parquet
shumpei.kubo@ShumpeinoMacBook-Pro Downloads % 

```

- 任意のファイルをduckdbコマンドで読み出す
```
shumpei.kubo@ShumpeinoMacBook-Pro Downloads % duckdb -c "select * from order_table_p0807.parquet"      
┌──────────────┬────────────────────┬────────────────────┬────────────────────┬───────────────────────┬──────────────────┬───────────────────┬───────────────────┐
│ ORDER_NUMBER │   RETAILER_NAME    │  RETAILER_NAME_MB  │ RETAILER_SITE_CODE │ RETAILER_CONTACT_CODE │ SALES_STAFF_CODE │ SALES_BRANCH_CODE │ ORDER_METHOD_CODE │
│    int32     │      varchar       │      varchar       │       int32        │         int32         │      int32       │       int32       │       int32       │
├──────────────┼────────────────────┼────────────────────┼────────────────────┼───────────────────────┼──────────────────┼───────────────────┼───────────────────┤
│       827148 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10230 │                40 │                 5 │
│       827292 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10246 │                40 │                 5 │
│       100025 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10056 │                19 │                 5 │
│       828835 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10351 │                40 │                 5 │
│       812263 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10230 │                40 │                 5 │
│       808651 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10356 │                40 │                 5 │
│       817756 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10356 │                40 │                 5 │
│       800260 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10356 │                40 │                 5 │
│       820248 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10351 │                40 │                 5 │
│       826318 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10351 │                40 │                 5 │
│       818146 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10351 │                40 │                 5 │
│       828486 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10246 │                40 │                 5 │
│       807492 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10360 │                40 │                 5 │
│       834409 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10351 │                40 │                 5 │
│       807124 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10346 │                40 │                 5 │
│       813194 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10351 │                40 │                 5 │
│       821591 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10246 │                40 │                 5 │
│       803285 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10351 │                40 │                 5 │
│       804877 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10351 │                40 │                 5 │
│       829317 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10230 │                40 │                 5 │
│          ·   │         ·          │         ·          │                ·   │                    ·  │              ·   │                 · │                 · │
│          ·   │         ·          │         ·          │                ·   │                    ·  │              ·   │                 · │                 · │
│          ·   │         ·          │         ·          │                ·   │                    ·  │              ·   │                 · │                 · │
│       822236 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10360 │                40 │                 5 │
│       823147 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10230 │                40 │                 5 │
│       831861 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10246 │                40 │                 5 │
│       834369 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10346 │                40 │                 5 │
│       100390 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10056 │                19 │                 5 │
│       100468 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10056 │                19 │                 5 │
│       813168 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10356 │                40 │                 5 │
│       803967 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10234 │                40 │                 5 │
│       816220 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10247 │                40 │                 5 │
│       804100 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10346 │                40 │                 5 │
│       100572 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10056 │                19 │                 5 │
│       822935 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10246 │                40 │                 5 │
│       103032 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10056 │                19 │                 5 │
│       802533 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10346 │                40 │                 5 │
│       802672 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10356 │                40 │                 5 │
│       803547 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10234 │                40 │                 5 │
│       814163 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10356 │                40 │                 5 │
│       805181 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10346 │                40 │                 5 │
│       819911 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10351 │                40 │                 5 │
│       820722 │ The Sports Factory │ The Sports Factory │              20577 │                  3596 │            10247 │                40 │                 5 │
├──────────────┴────────────────────┴────────────────────┴────────────────────┴───────────────────────┴──────────────────┴───────────────────┴───────────────────┤
│ 90 rows (40 shown)                                                                                                                                   8 columns │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
shumpei.kubo@ShumpeinoMacBook-Pro Downloads % 
```

- 非常に見やすい形式で、列名やデータ型、サンプルデータが読み取れます
- 上記の場合、行数はトータルで90行あるようですが、デフォルトでは真ん中を除いて40行が表示されました

---

10000行を超えるデータでも表示されるのは40行です
```
shumpei.kubo@ShumpeinoMacBook-Pro Downloads % duckdb -c "select * from airclaft.parquet"
┌─────────────┬───────────────────┬──────────────────────┐
│ tail_number │   manufacturer    │        model         │
│   varchar   │      varchar      │       varchar        │
├─────────────┼───────────────────┼──────────────────────┤
│ N789SW      │ Boeing            │ B-737-7H4            │
│ N198UW      │ Airbus            │ A321-211             │
│ N681UP      │ Boeing            │ B747-1               │
│ N54711      │ Boeing            │ B737-700PAX          │
│ N390SW      │ Boeing            │ B-737-3H4            │
│ N258FE      │ Boeing            │ B727-2               │
│ N10323      │ Boeing            │ B737-300PAX          │
│ N956NN      │ Boeing            │ B737PASSENGER        │
│ N8616       │ Boeing            │ 737-800PASSENGERONLY │
│ N765AT      │ Boeing            │ B727-2               │
│ N641SW      │ Boeing            │ B-737-3H4            │
│ N493DN      │ McDonnell-Douglas │ MD-82-PSGR           │
│ N351WQ      │ Bombardier        │ Q400                 │
│ N206UW      │ Boeing            │ B757-2B7             │
│ N928EV      │ Bombardier        │ CRJ200-2B19          │
│ N828MH      │ Boeing            │ B767-400             │
│ N730YX      │ Embraer           │ ERJ-170-200LR        │
│ N606AA      │ Boeing            │ B757-223PASSENGER    │
│ N439UA      │ Airbus            │ AirbusA320-232PAX    │
│ N309DQ      │ Boeing            │ B-737-7L             │
│   ·         │   ·               │    ·                 │
│   ·         │   ·               │    ·                 │
│   ·         │   ·               │    ·                 │
│ N335AA      │ Boeing            │ B767-223ERPASSENGER  │
│ N185UW      │ Airbus            │ A321-211             │
│ N920CA      │ Canadair          │ RJ100/ER             │
│ N816NW      │ Airbus            │ A330-PSGR            │
│ N715SF      │ Canadair          │ RJ100/ER             │
│ N589UA      │ Boeing            │ B757-222PAX          │
│ N950NN      │ Boeing            │ B737PASSENGER        │
│ N424        │ Boeing            │ 737-700PASSENGERONLY │
│ N295UX      │ Embraer           │ EMB-120              │
│ N14181      │ Embraer           │ ERJ-145XR            │
│ N987        │ Boeing            │ 717-200PASSENGERONLY │
│ N8926E      │ McDonnell-Douglas │ DC-9-30              │
│ N7848B      │ Douglas           │ COMMANDO             │
│ N673AW      │ Airbus            │ A320-232             │
│ N530PA      │ BAE               │ JETSTM31             │
│ N923TW      │ McDonnell-Douglas │ SUPER80PASSENGER     │
│ N379WN      │ Boeing            │ 737-300PASSENGERONLY │
│ N821NN      │ Boeing            │ B737-823PASSENGER    │
│ N247LR      │ Bombardier        │ CRJ-900-PSGR         │
│ N722AN      │ Boeing            │ B777-300PASSENGER    │
├─────────────┴───────────────────┴──────────────────────┤
│ 13101 rows (40 shown)                        3 columns │
└────────────────────────────────────────────────────────┘
shumpei.kubo@ShumpeinoMacBook-Pro Downloads % 
```

---
- このメタデータを使って、parquetファイル群が入っているフォルダをデータソースとしてデータレイクハウスからSQLで読み出す、というお話は、また別途、どこかで記載します