跳到内容

Parquet

加载或写入 Parquet 文件速度非常快,因为 Polars DataFrame 在内存中的数据布局与 Parquet 文件在磁盘上的布局在许多方面都相似。

与 CSV 不同,Parquet 是一种列式格式。这意味着数据按列而不是按行存储。这是一种更高效的数据存储方式,因为它允许更好的压缩和更快的数据访问。

读取

我们可以使用 read_parquet 函数将 Parquet 文件读取到 DataFrame

read_parquet

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

ParquetReader · 功能 `parquet` 可用

let mut file = std::fs::File::open("docs/assets/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/assets/data/path.parquet")

ParquetWriter · 功能 `parquet` 可用

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

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

扫描

Polars 允许你 扫描 Parquet 输入。扫描会延迟文件的实际解析,而是返回一个名为 LazyFrame 的延迟计算持有者。

scan_parquet

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

scan_parquet · 功能 `parquet` 可用

let args = ScanArgsParquet::default();
let lf = LazyFrame::scan_parquet("docs/assets/data/path.parquet", args).unwrap();

如果你想知道为什么这是理想的,你可以在这里阅读更多关于 Polars 优化器 的信息。

当我们扫描存储在云中的 Parquet 文件时,我们还可以应用谓词下推(predicate pushdown)和投影下推(projection pushdown)。这可以显著减少需要下载的数据量。有关扫描云中 Parquet 文件的信息,请参阅云存储