diff --git a/rust/parquet/src/arrow/array_reader.rs b/rust/parquet/src/arrow/array_reader.rs index 137b9ab6a3a..de929508675 100644 --- a/rust/parquet/src/arrow/array_reader.rs +++ b/rust/parquet/src/arrow/array_reader.rs @@ -97,11 +97,12 @@ impl PrimitiveArrayReader { .clone(); let mut record_reader = RecordReader::::new(column_desc.clone()); - record_reader.set_page_reader( - pages - .next() - .ok_or_else(|| general_err!("Can't build array without pages!"))??, - )?; + match pages.next() { + Some(page_reader) => { + record_reader.set_page_reader(page_reader?)?; + } + None => {} + } Ok(Self { data_type, @@ -133,6 +134,9 @@ impl ArrayReader for PrimitiveArrayReader { let records_to_read = batch_size - records_read; let records_read_once = self.record_reader.read_records(records_to_read)?; + if records_read_once == 0 { + break; // record reader has no record + } records_read = records_read + records_read_once; // Record reader exhausted diff --git a/rust/parquet/src/arrow/record_reader.rs b/rust/parquet/src/arrow/record_reader.rs index 2acc01ca33e..e7c39f0f890 100644 --- a/rust/parquet/src/arrow/record_reader.rs +++ b/rust/parquet/src/arrow/record_reader.rs @@ -156,7 +156,10 @@ impl RecordReader { /// /// Number of actual records read. pub fn read_records(&mut self, num_records: usize) -> Result { - assert!(self.column_reader.is_some()); + if self.column_reader.is_none() { + return Ok(0); + } + let mut records_read = 0; // Used to mark whether we have reached the end of current