カラム型ストレージは素晴らしいよ。複雑なネストされたスキーマをリーフ値に分解して、プリミティブとして保存できるから。リーフ値に直接アクセスできるから、IOやパースの手間が大幅に減るんだ。これらのフォーマットは実際には最上位レベルで行のグループにパーティション分けされていることに注意してね。ここでの大きな利点は、データページからApache Arrowのバッファを直接取得できること。提供されたWASMを使うか、ネイティブデコーダーを持ち込むことで実現できる。Parquetでは、これが現在非常に複雑なんだ。ParquetはDremelエンコーディングを使っていて、プリミティブ値と二つの整数ストリーム(繰り返しと定義レベル)を一緒に保存して、スキーマから構築された状態機械を使ってレコードを再構築するんだ。これらの整数ストリームを取得するのも難しい。Parquetは「RLE」に決まっていて、これはビットパッキングとランレングスエンコーディングの混合で、リファレンス実装ではビットパッキング部分だけで74,000行の生成コードを使ってる。だから、ParquetからArrowバッファを取得するのはかなりの手間がかかる。F3はこれをずっと簡単にして、将来にも対応できるはず。ここでの提案された利点の一つは、メタデータへのランダムアクセスができること。GeoParquetを使うときは、メタデータをSQLiteにインデックスしてる。そうしないと、例えばOverture Mapsで空間クエリを実行するのに約10分かかるところが、数ミリ秒で済むから。約500ファイルのフッターをパースする必要があって、約150MBのThriftをパースしてクエリしなきゃいけない。でも、GoogleのFlatbuffersを選ぶのはちょっと変だね。FlatBuffersのメモリ安全性は知られている問題だし[1]、これらの脅威を軽減するために生成されたコードが実際のパフォーマンス向上を示すとは思えない。実際、SQLiteデータベースを埋め込んじゃえばいいんじゃない?[1] https://rustsec.org/advisories/RUSTSEC-2021-0122.html