Parquet
加载或写入 Parquet
文件速度非常快,因为 Polars DataFrame
在内存中的数据布局与 Parquet 文件在磁盘上的布局在许多方面都相似。
与 CSV 不同,Parquet 是一种列式格式。这意味着数据按列而不是按行存储。这是一种更高效的数据存储方式,因为它允许更好的压缩和更快的数据访问。
读取
我们可以使用 read_parquet
函数将 Parquet
文件读取到 DataFrame
中
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();
写入
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
的延迟计算持有者。
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 文件的信息,请参阅云存储。