This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new d624c0d03e Support Time Parquet Data Page Statistics (#11187)
d624c0d03e is described below

commit d624c0d03e56779c335b8c5ece8787baac7416db
Author: Dharan Aditya <[email protected]>
AuthorDate: Mon Jul 1 16:50:27 2024 +0530

    Support Time Parquet Data Page Statistics (#11187)
    
    * add parquet page stats for time
    
    * return empty array instead of null
    
    * fix typos
---
 .../datasource/physical_plan/parquet/statistics.rs | 42 ++++++++++++++++++----
 datafusion/core/tests/parquet/arrow_statistics.rs  |  8 ++---
 2 files changed, 39 insertions(+), 11 deletions(-)

diff --git a/datafusion/core/src/datasource/physical_plan/parquet/statistics.rs 
b/datafusion/core/src/datasource/physical_plan/parquet/statistics.rs
index 67c517ddbc..f68334ec24 100644
--- a/datafusion/core/src/datasource/physical_plan/parquet/statistics.rs
+++ b/datafusion/core/src/datasource/physical_plan/parquet/statistics.rs
@@ -22,13 +22,13 @@
 use arrow::datatypes::i256;
 use arrow::{array::ArrayRef, datatypes::DataType};
 use arrow_array::{
-    new_null_array, BinaryArray, BooleanArray, Date32Array, Date64Array, 
Decimal128Array,
-    Decimal256Array, FixedSizeBinaryArray, Float16Array, Float32Array, 
Float64Array,
-    Int16Array, Int32Array, Int64Array, Int8Array, LargeBinaryArray, 
LargeStringArray,
-    StringArray, Time32MillisecondArray, Time32SecondArray, 
Time64MicrosecondArray,
-    Time64NanosecondArray, TimestampMicrosecondArray, 
TimestampMillisecondArray,
-    TimestampNanosecondArray, TimestampSecondArray, UInt16Array, UInt32Array,
-    UInt64Array, UInt8Array,
+    new_empty_array, new_null_array, BinaryArray, BooleanArray, Date32Array, 
Date64Array,
+    Decimal128Array, Decimal256Array, FixedSizeBinaryArray, Float16Array, 
Float32Array,
+    Float64Array, Int16Array, Int32Array, Int64Array, Int8Array, 
LargeBinaryArray,
+    LargeStringArray, StringArray, Time32MillisecondArray, Time32SecondArray,
+    Time64MicrosecondArray, Time64NanosecondArray, TimestampMicrosecondArray,
+    TimestampMillisecondArray, TimestampNanosecondArray, TimestampSecondArray,
+    UInt16Array, UInt32Array, UInt64Array, UInt8Array,
 };
 use arrow_schema::{Field, FieldRef, Schema, TimeUnit};
 use datafusion_common::{internal_datafusion_err, internal_err, plan_err, 
Result};
@@ -873,6 +873,34 @@ macro_rules! get_data_page_statistics {
                     Decimal128Array::from_iter([<$stat_type_prefix 
Decimal128DataPageStatsIterator>]::new($iterator).flatten()).with_precision_and_scale(*precision,
 *scale)?)),
                 Some(DataType::Decimal256(precision, scale)) => Ok(Arc::new(
                     Decimal256Array::from_iter([<$stat_type_prefix 
Decimal256DataPageStatsIterator>]::new($iterator).flatten()).with_precision_and_scale(*precision,
 *scale)?)),
+                Some(DataType::Time32(unit)) => {
+                    Ok(match unit {
+                        TimeUnit::Second =>  
Arc::new(Time32SecondArray::from_iter(
+                            [<$stat_type_prefix 
Int32DataPageStatsIterator>]::new($iterator).flatten(),
+                        )),
+                        TimeUnit::Millisecond => 
Arc::new(Time32MillisecondArray::from_iter(
+                            [<$stat_type_prefix 
Int32DataPageStatsIterator>]::new($iterator).flatten(),
+                        )),
+                        _ => {
+                            // don't know how to extract statistics, so return 
an empty array
+                            new_empty_array(&DataType::Time32(unit.clone()))
+                        }
+                    })
+                }
+                Some(DataType::Time64(unit)) => {
+                    Ok(match unit {
+                        TimeUnit::Microsecond =>  
Arc::new(Time64MicrosecondArray::from_iter(
+                            [<$stat_type_prefix 
Int64DataPageStatsIterator>]::new($iterator).flatten(),
+                        )),
+                        TimeUnit::Nanosecond => 
Arc::new(Time64NanosecondArray::from_iter(
+                            [<$stat_type_prefix 
Int64DataPageStatsIterator>]::new($iterator).flatten(),
+                        )),
+                        _ => {
+                            // don't know how to extract statistics, so return 
an empty array
+                            new_empty_array(&DataType::Time64(unit.clone()))
+                        }
+                    })
+                }
                 _ => unimplemented!()
             }
         }
diff --git a/datafusion/core/tests/parquet/arrow_statistics.rs 
b/datafusion/core/tests/parquet/arrow_statistics.rs
index 47f079063d..b68ebffa10 100644
--- a/datafusion/core/tests/parquet/arrow_statistics.rs
+++ b/datafusion/core/tests/parquet/arrow_statistics.rs
@@ -1204,7 +1204,7 @@ async fn test_time32_second_diff_rg_sizes() {
         expected_null_counts: UInt64Array::from(vec![0, 0, 0, 0]), // Assuming 
1 null per row group for simplicity
         expected_row_counts: Some(UInt64Array::from(vec![4, 4, 4, 4])),
         column_name: "second",
-        check: Check::RowGroup,
+        check: Check::Both,
     }
     .run();
 }
@@ -1231,7 +1231,7 @@ async fn test_time32_millisecond_diff_rg_sizes() {
         expected_null_counts: UInt64Array::from(vec![0, 0, 0, 0]), // Assuming 
1 null per row group for simplicity
         expected_row_counts: Some(UInt64Array::from(vec![4, 4, 4, 4])),
         column_name: "millisecond",
-        check: Check::RowGroup,
+        check: Check::Both,
     }
     .run();
 }
@@ -1264,7 +1264,7 @@ async fn test_time64_microsecond_diff_rg_sizes() {
         expected_null_counts: UInt64Array::from(vec![0, 0, 0, 0]), // Assuming 
1 null per row group for simplicity
         expected_row_counts: Some(UInt64Array::from(vec![4, 4, 4, 4])),
         column_name: "microsecond",
-        check: Check::RowGroup,
+        check: Check::Both,
     }
     .run();
 }
@@ -1297,7 +1297,7 @@ async fn test_time64_nanosecond_diff_rg_sizes() {
         expected_null_counts: UInt64Array::from(vec![0, 0, 0, 0]), // Assuming 
1 null per row group for simplicity
         expected_row_counts: Some(UInt64Array::from(vec![4, 4, 4, 4])),
         column_name: "nanosecond",
-        check: Check::RowGroup,
+        check: Check::Both,
     }
     .run();
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to