🦔

Parquetファイルをローカル環境でSQLを使ってクエリする

2023/08/02に公開

Parquetファイルを手元でちょっと確認したいことってありますよね。
手軽に確認する方法がありましたので紹介します。

環境

macOSを想定しています。

使用するツール

dsq

brew install dsq

parquet-cli

brew install parquet-cli

Parquetファイルのスキーマを確認する

parquet-cli, dsqのどちらでも確認できます。

# parquet-cliで先頭の1件目を表示する。
# cat, headのどちらも同じ動作です。
parquet cat -n 1 example.parquet
parquet head -n 1 example.parquet

# dsqで先頭の1件目を表示する。
dsq example.parquet "select * from {} limit 1"

単一のParquetファイルをクエリする

dsqを使用してクエリできます。

dsq example.parquet "select count(*) from {}"
# [{"count(*)":41840}]

# asで別名を指定する。
dsq example.parquet "select count(*) as count from {}"
# [{"count":41840}]

# --prettyオプションを指定する。
dsq --pretty example.parquet "select count(*) from {}"
# +----------+
# | count(*) |
# +----------+
# |    41840 |
# +----------+
# (1 row)

# パイプでParquetファイルの中身を渡す。
cat example.parquet | dsq -s parquet "select count(*) as count from {}"
# [{"count(*)":41840}]

同じスキーマの複数のParquetファイルを横断してクエリする

方法1. dsqに複数のファイルを指定してUNION ALLで連結する

# UNION ALLではなくUNIONで連結すると重複行が削除されてしまうので注意。
dsq example-1.parquet example-2.parquet \
"
select count(*)
from (
  select * from {0}
  union all
  select * from {1}
)
"
# [{"count(*)":166255}]

方法2. ファイルを結合してからdsqでクエリする

# parquet rewriteコマンドでparquetファイルを結合する。
# -i : 入力するファイル名を指定する(カンマ区切りで複数指定可能)。
# -o : 出力ファイル名を指定する。
#
# find, trコマンドを使用してカレントディレクトリの配下にあるparquetファイル
# の名前をカンマ区切りで連結して-iオプションに渡している。
parquet rewrite -i $(find ./ -type f -name "*.parquet" | tr '\n' ',') -o merged.parquet

# 結合したファイルをdsqでクエリする。
dsq merged.parquet "select count(*) from {}"
# [{"count(*)":166255}]

別のスキーマのParquetファイルをJOINする

ここでは2つのParquetファイルをJOINしていますが、ParquetとCSVなど別のフォーマットのファイルでもJOINできます。

dsq example-A.parquet example-B.parquet \
"
select A.col, B.col
from {0} as A
join {1} as B on A.id = B.id
"

Discussion