Skip to content

Parquet

Polars の DataFrame メモリ上のデータレイアウトが Parquet ファイルのディスク上のレイアウトに多くの点で似ているため、 Parquet ファイル の読み込みや書き込みは高速です。

CSV とは異なり、Parquet はカラム型のフォーマットです。これは、データがロー単位ではなくカラム単位で格納されることを意味します。これはデータの圧縮と高速なデータアクセスを可能にする、より効率的な方法です。

読み込み

read_parquet 関数を使って、 Parquet ファイルを DataFrame に読み込むことができます:

read_parquet

df = pl.read_parquet("docs/data/path.parquet")

ParquetReader · Available on feature parquet

let mut file = std::fs::File::open("docs/data/path.parquet").unwrap();

let df = ParquetReader::new(&mut file).finish().unwrap();

書き込み

write_parquet

df = pl.DataFrame({"foo": [1, 2, 3], "bar": [None, "bak", "baz"]})
df.write_parquet("docs/data/path.parquet")

ParquetWriter · Available on feature parquet

let mut df = df!(
    "foo" => &[1, 2, 3],
    "bar" => &[None, Some("bak"), Some("baz")],
)
.unwrap();

let mut file = std::fs::File::create("docs/data/path.parquet").unwrap();
ParquetWriter::new(&mut file).finish(&mut df).unwrap();

スキャン

Polars では、 Parquet 入力をスキャンすることができます。スキャンすると、ファイルの実際の解析が遅延され、代わりに LazyFrame と呼ばれる遅延計算ホルダーが返されます。

scan_parquet

df = pl.scan_parquet("docs/data/path.parquet")

scan_parquet · Available on feature parquet

let args = ScanArgsParquet::default();
let lf = LazyFrame::scan_parquet("./file.parquet", args).unwrap();

なぜこれが望ましいのかについては、Polars の最適化について こちら で詳しく説明しています。

クラウドに保存された Parquet ファイルをスキャンする場合、述語と射影のプッシュダウンを適用することもできます。これにより、ダウンロードする必要のあるデータ量を大幅に削減できます。クラウドストレージからの Parquet ファイルのスキャンについては、クラウドストレージ をご覧ください。