diff --git a/Cargo.lock b/Cargo.lock
index 297b566f46..d00fce338e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1127,6 +1127,20 @@ name = "bytemuck"
version = "1.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec"
+dependencies = [
+ "bytemuck_derive",
+]
+
+[[package]]
+name = "bytemuck_derive"
+version = "1.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
[[package]]
name = "byteorder"
@@ -3056,6 +3070,7 @@ version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b"
dependencies = [
+ "bytemuck",
"cfg-if",
"crunchy",
"num-traits",
@@ -3361,6 +3376,7 @@ dependencies = [
"reqwest",
"roaring",
"serde",
+ "serde_arrow",
"serde_bytes",
"serde_derive",
"serde_json",
@@ -4130,6 +4146,21 @@ dependencies = [
"twox-hash",
]
+[[package]]
+name = "marrow"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f5240d6977234968ff9ad254bfa73aa397fb51e41dcb22b1eb85835e9295485b"
+dependencies = [
+ "arrow-array",
+ "arrow-buffer",
+ "arrow-data",
+ "arrow-schema",
+ "bytemuck",
+ "half",
+ "serde",
+]
+
[[package]]
name = "md-5"
version = "0.10.6"
@@ -5893,6 +5924,21 @@ dependencies = [
"serde",
]
+[[package]]
+name = "serde_arrow"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2784e59a0315568e850cb01ddadf458f8c09e28d8cfc4880c2cc08f5dc3444e0"
+dependencies = [
+ "arrow-array",
+ "arrow-schema",
+ "bytemuck",
+ "chrono",
+ "half",
+ "marrow",
+ "serde",
+]
+
[[package]]
name = "serde_bytes"
version = "0.11.19"
diff --git a/crates/iceberg/Cargo.toml b/crates/iceberg/Cargo.toml
index aa1d0cd4a5..18729176dc 100644
--- a/crates/iceberg/Cargo.toml
+++ b/crates/iceberg/Cargo.toml
@@ -91,6 +91,7 @@ rand = { workspace = true }
regex = { workspace = true }
tempfile = { workspace = true }
minijinja = { workspace = true }
+serde_arrow = { version = "0.14", features = ["arrow-58"] }
[package.metadata.cargo-machete]
# These dependencies are added to ensure minimal dependency version
diff --git a/crates/iceberg/src/arrow/reader.rs b/crates/iceberg/src/arrow/reader.rs
index 700ba69262..9ccf1ac3d7 100644
--- a/crates/iceberg/src/arrow/reader.rs
+++ b/crates/iceberg/src/arrow/reader.rs
@@ -1100,7 +1100,7 @@ fn build_field_id_map(parquet_schema: &SchemaDescriptor) -> Result