use std::fs::File;
use arrow2::array::Array;
use arrow2::chunk::Chunk;
use arrow2::datatypes::Schema;
use arrow2::error::Result;
use arrow2::io::ipc::read;
use arrow2::io::print;
#[allow(clippy::type_complexity)]
fn read_chunks(path: &str) -> Result<(Schema, Vec<Chunk<Box<dyn Array>>>)> {
let mut file = File::open(path)?;
let metadata = read::read_file_metadata(&mut file)?;
let schema = metadata.schema.clone();
let reader = read::FileReader::new(file, metadata, None, None);
let chunks = reader.collect::<Result<Vec<_>>>()?;
Ok((schema, chunks))
}
fn read_batch(path: &str) -> Result<(Schema, Chunk<Box<dyn Array>>)> {
let mut file = File::open(path)?;
let metadata = read::read_file_metadata(&mut file)?;
let schema = metadata.schema.clone();
let dictionaries = read::read_file_dictionaries(&mut file, &metadata, &mut Default::default())?;
let chunk_index = 0;
let chunk = read::read_batch(
&mut file,
&dictionaries,
&metadata,
None,
None,
chunk_index,
&mut Default::default(),
&mut Default::default(),
)?;
Ok((schema, chunk))
}
fn main() -> Result<()> {
use std::env;
let args: Vec<String> = env::args().collect();
let file_path = &args[1];
let (schema, chunks) = read_chunks(file_path)?;
let names = schema.fields.iter().map(|f| &f.name).collect::<Vec<_>>();
println!("{}", print::write(&chunks, &names));
let (schema, chunk) = read_batch(file_path)?;
let names = schema.fields.iter().map(|f| &f.name).collect::<Vec<_>>();
println!("{}", print::write(&[chunk], &names));
Ok(())
}