🦔
Parquetファイルをローカル環境でSQLを使ってクエリする
Parquetファイルを手元でちょっと確認したいことってありますよね。
手軽に確認する方法がありましたので紹介します。
環境
macOSを想定しています。
使用するツール
dsq
-
ParquetファイルをSQLでクエリすることができるコマンドラインツールです。
他にもJSON, CSV, EXCELをクエリできます。 - Homebrewがインストールされていれば、以下のコマンドでインストールできます。
brew install dsq
parquet-cli
- Parquetファイルのための便利なコマンドラインツールです。
- Homebrewがインストールされていれば、以下のコマンドでインストールできます。
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