diff --git a/arrow-schema/src/field.rs b/arrow-schema/src/field.rs index a1c509abf2e0..c4df33f76b95 100644 --- a/arrow-schema/src/field.rs +++ b/arrow-schema/src/field.rs @@ -30,6 +30,9 @@ use crate::{ extension::{EXTENSION_TYPE_METADATA_KEY, EXTENSION_TYPE_NAME_KEY, ExtensionType}, }; +/// The metadata key for the Parquet field id of a [`Field`]. +pub const PARQUET_FIELD_ID_META_KEY: &str = "PARQUET:field_id"; + /// A reference counted [`Field`] pub type FieldRef = Arc; @@ -504,6 +507,16 @@ impl Field { .map(String::as_ref) } + /// Returns the parquet field id of this [`Field`], if set. + /// + /// This returns the value of [`PARQUET_FIELD_ID_META_KEY`] metadata key, parsed + /// as an `i32`. Returns `None` if the key is not present or the value + /// is not a valid integer. + pub fn id(&self) -> Option { + let value = self.metadata().get(PARQUET_FIELD_ID_META_KEY)?; + value.parse().ok() + } + /// Returns an instance of the given [`ExtensionType`] of this [`Field`], /// if set in the [`Field::metadata`]. /// diff --git a/parquet/src/arrow/mod.rs b/parquet/src/arrow/mod.rs index 52152988166f..1d2c0bd8749a 100644 --- a/parquet/src/arrow/mod.rs +++ b/parquet/src/arrow/mod.rs @@ -224,7 +224,7 @@ pub const ARROW_SCHEMA_META_KEY: &str = "ARROW:schema"; /// /// [`Field::metadata`]: arrow_schema::Field::metadata /// [`BasicTypeInfo::id`]: crate::schema::types::BasicTypeInfo::id -pub const PARQUET_FIELD_ID_META_KEY: &str = "PARQUET:field_id"; +pub use arrow_schema::PARQUET_FIELD_ID_META_KEY; /// A [`ProjectionMask`] identifies a set of columns within a potentially nested schema to project /// diff --git a/parquet/src/arrow/schema/mod.rs b/parquet/src/arrow/schema/mod.rs index b2b93687ba89..a3cfe3adc645 100644 --- a/parquet/src/arrow/schema/mod.rs +++ b/parquet/src/arrow/schema/mod.rs @@ -543,7 +543,7 @@ fn arrow_to_parquet_type(field: &Field, coerce_types: bool) -> Result { } else { Repetition::REQUIRED }; - let id = field_id(field); + let id = field.id(); // create type from field match field.data_type() { DataType::Null => Type::primitive_type_builder(name, PhysicalType::INT32) @@ -860,11 +860,6 @@ fn arrow_to_parquet_type(field: &Field, coerce_types: bool) -> Result { } } -fn field_id(field: &Field) -> Option { - let value = field.metadata().get(super::PARQUET_FIELD_ID_META_KEY)?; - value.parse().ok() // Fail quietly if not a valid integer -} - #[cfg(test)] mod tests { use super::*;