use std::{fs::File, path::Path};
use arrow_array::RecordBatch;
use parquet::{
arrow::{ArrowWriter, arrow_reader::ParquetRecordBatchReaderBuilder},
file::properties::WriterProperties,
};
use crate::error::Result;
pub fn read(path: impl AsRef<Path>) -> Result<Vec<RecordBatch>> {
let file = File::open(path)?;
let builder = ParquetRecordBatchReaderBuilder::try_new(file)?;
let reader = builder.build()?;
let mut batches = Vec::new();
for batch in reader {
batches.push(batch?);
}
Ok(batches)
}
pub fn write(path: impl AsRef<Path>, batches: &[RecordBatch]) -> Result<()> {
if batches.is_empty() {
return Ok(());
}
let schema = batches[0].schema();
let file = File::create(path)?;
let props = WriterProperties::builder().build();
let mut writer = ArrowWriter::try_new(file, schema, Some(props))?;
for batch in batches {
writer.write(batch)?;
}
writer.close()?;
Ok(())
}