Summary:
また,Parquetは自己記述的なメタデータをファイルのヘッダーに持ち,各列のデータ型や統計情報が含まれるため,クエリエンジンが効率的にデータをスキップし高速に処理できる.
具体的には,Parquetでは,データを行単位ではなく列単位に分割して格納し,同じ列の値を連続して保存する形式である.
例えば社員データにおいて,以下のような表があるとする.
社員ID | 氏名 | 年齢 | 部署 |
---|---|---|---|
1001 | 田中太郎 | 30 | 営業部 |
1002 | 鈴木花子 | 25 | 技術部 |
1003 | 佐藤次郎 | 28 | 総務部 |
Parquetではこのデータを,社員ID列のデータだけが連続して格納され[例:1001, 1002, 1003],次に氏名列のデータが連続して格納され[田中太郎, 鈴木花子, 佐藤次郎],同様に年齢や部署の列データもそれぞれ別々に連続保存される.このため,例えば年齢だけを集計したい場合は該当の年齢列だけを読み込めばよく,他の列のデータを読み込む必要がない.これによりI/Oが削減され高速処理が可能になる.
またParquetファイルは,これらの列データをさらに「ページ」という単位に細分化し,圧縮やスキップを効率化している.例えば1000件ずつのページに分けて保存し,必要なページだけ読み込むことで,さらに処理効率を高めている.加えて,メタデータとして各列のデータ型や統計情報(最大値・最小値など)を持つため,クエリエンジンは条件に合わないページを読み飛ばすこともできる.
Parquetの歴史は,FacebookやTwitterなどの大規模インターネット企業が効率的なビッグデータ処理を求めて列指向フォーマットの開発を進めたことに始まる.2013年にApacheプロジェクトとして公開されて以降,HadoopエコシステムやSpark,Presto,Hiveなどの多くのビッグデータ処理基盤に採用されている.技術的には,Parquetは大規模分散環境やクラウドストレージに適合しており,オブジェクトストレージに保存されたデータを効率的に処理できることが特徴である.
データベースにおけるコンピュートとストレージの分離の観点からは,Parquetは主にストレージ層に最適化されたファイル形式として機能する.オブジェクトストレージ上にParquetファイルとして格納されたデータは,高い耐久性とコスト効率を実現する一方,実際のクエリ処理や分析は別のコンピュート層で行われる.コンピュート層は必要な列のデータだけをParquetファイルから読み込み,計算資源を効率的に活用することが可能である.このストレージとコンピュートの分離により,システム全体として高いスケーラビリティと柔軟性が確保され,LakehouseやLakebaseといったクラウドネイティブなデータ基盤において重要な基盤技術となっている.
Mathematics is the language with which God has written the universe.