Skip to content

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文件时,我们也可以应用谓词和投影下推。这可以显著减少需要下载的数据量。有关在云端扫描Parquet文件的更多信息,请参阅云存储