{"record":{"id":"08708e455df91c01","repo":"influxdata/influxdb","slug":"could-not-convert-parquet-schema-to-arrow-schema-0","errorCode":null,"errorMessage":"Could not convert Parquet schema to Arrow schema: {0}","messagePattern":"Could not convert Parquet schema to Arrow schema: (.+?)","errorType":"error_code","errorClass":"TimestampMinMaxError","httpStatus":null,"severity":"error","filePath":"core/parquet_file/src/metadata.rs","lineNumber":1011,"sourceCode":"    parquet_metadata: &ParquetMetaData,\n) -> Result<Option<TimestampMinMax>, TimestampMinMaxError> {\n    let timestamp_min_maxes = parquet_metadata\n        .row_groups()\n        .iter()\n        .map(timestamp_min_max)\n        .collect::<Result<Vec<_>, _>>()?;\n    let file_timestamp_min_max = timestamp_min_maxes\n        .into_iter()\n        .reduce(|acc, i| acc.union(&i));\n\n    Ok(file_timestamp_min_max)\n}\n\n/// Errors that may happen while collecting the min and max timestamps\n#[expect(missing_docs)]\n#[derive(Debug, Error)]\npub enum TimestampMinMaxError {\n    #[error(\"Could not convert Parquet schema to Arrow schema: {0}\")]\n    SchemaConversion(#[from] parquet::errors::ParquetError),\n\n    #[error(\"Could not find a time column\")]\n    NoTimeColumnFound,\n\n    #[error(\"Could not find time column statistics\")]\n    NoColumnStatisticsFound,\n\n    #[error(\"Expected time column to have type Int64; instead found {actual:?}\")]\n    IncorrectTimeColumnType { actual: parquet::basic::Type },\n}\n\nfn timestamp_min_max(\n    row_group: &ParquetRowGroupMetaData,\n) -> Result<TimestampMinMax, TimestampMinMaxError> {\n    let statistics = row_group\n        .columns()\n        .iter()","sourceCodeStart":993,"sourceCodeEnd":1029,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/core/parquet_file/src/metadata.rs#L993-L1029","documentation":"TimestampMinMaxError::SchemaConversion — converting the Parquet schema to an Arrow schema failed while computing timestamp min/max values. Wrapped parquet::errors::ParquetError; indicates an incompatibility between the file's Parquet types and Arrow's supported type space.","triggerScenarios":"Calling the timestamp min/max helper on a file containing Parquet logical/physical types the arrow schema converter rejects (exotic logical types, unsupported repetition/def levels).","commonSituations":"Foreign Parquet files with newer logical types than the pinned parquet/arrow crates support, version skew between parquet and arrow crate versions.","solutions":["Upgrade the parquet and arrow crates to compatible versions supporting the file's logical types","Reject foreign schemas before calling the min/max helper (validate against the expected IOx schema)","Inspect the underlying ParquetError message for the specific unsupported type"],"exampleFix":"// caller-side handling\nmatch parquet_file.timestamp_min_max() {\n    Err(TimestampMinMaxError::SchemaConversion(e)) => warn!(\"unsupported schema: {e}\"),\n    r => r?,\n}","handlingStrategy":"try-catch","validationCode":"let arrow_schema = parquet::arrow::parquet_to_arrow_schema(&md.file_metadata(), None)?; // early check","typeGuard":null,"tryCatchPattern":"match ts_min_max {\n    Err(TimestampMinMaxError::SchemaConversion(e)) => { warn!(\"schema unsupported: {e}\"); fallback(); }\n    other => other?,\n}","preventionTips":["Keep parquet and arrow crate versions aligned","Validate foreign files against the expected IOx schema before processing","Upgrade arrow-parquet when files with newer logical types arrive"],"tags":["parquet","arrow","schema-conversion","type-mismatch"],"backgroundTag":"schema-validation-failed","analyzedSha":"06200ef96ba82c5f6727e5038a83af8e722c6875","analyzedAt":"2026-09-19T12:55:30.003Z","contentChangedAt":"2026-09-19T12:55:30.003Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}