|
26 | 26 | #include <arrow/record_batch.h> |
27 | 27 | #include <arrow/result.h> |
28 | 28 | #include <arrow/type.h> |
| 29 | +#include <arrow/util/key_value_metadata.h> |
29 | 30 | #include <parquet/arrow/reader.h> |
30 | 31 | #include <parquet/arrow/schema.h> |
31 | 32 | #include <parquet/file_reader.h> |
@@ -185,6 +186,31 @@ class ParquetReader::Impl { |
185 | 186 | return arrow_schema; |
186 | 187 | } |
187 | 188 |
|
| 189 | + Result<std::unordered_map<std::string, std::string>> Metadata() { |
| 190 | + if (reader_ == nullptr) { |
| 191 | + return InvalidArgument("Reader is not opened"); |
| 192 | + } |
| 193 | + |
| 194 | + auto metadata = reader_->parquet_reader()->metadata(); |
| 195 | + if (!metadata) { |
| 196 | + return InvalidArgument("Failed to get Parquet file metadata"); |
| 197 | + } |
| 198 | + |
| 199 | + auto kv_metadata = metadata->key_value_metadata(); |
| 200 | + if (!kv_metadata) { |
| 201 | + return std::unordered_map<std::string, std::string>{}; |
| 202 | + } |
| 203 | + |
| 204 | + std::unordered_map<std::string, std::string> metadata_map; |
| 205 | + metadata_map.reserve(kv_metadata->size()); |
| 206 | + |
| 207 | + for (int i = 0; i < kv_metadata->size(); ++i) { |
| 208 | + metadata_map.try_emplace(kv_metadata->key(i), kv_metadata->value(i)); |
| 209 | + } |
| 210 | + |
| 211 | + return metadata_map; |
| 212 | + } |
| 213 | + |
188 | 214 | private: |
189 | 215 | Status InitReadContext() { |
190 | 216 | context_ = std::make_unique<ReadContext>(); |
@@ -251,6 +277,10 @@ Result<std::optional<ArrowArray>> ParquetReader::Next() { return impl_->Next(); |
251 | 277 |
|
252 | 278 | Result<ArrowSchema> ParquetReader::Schema() { return impl_->Schema(); } |
253 | 279 |
|
| 280 | +Result<std::unordered_map<std::string, std::string>> ParquetReader::Metadata() { |
| 281 | + return impl_->Metadata(); |
| 282 | +} |
| 283 | + |
254 | 284 | Status ParquetReader::Open(const ReaderOptions& options) { |
255 | 285 | impl_ = std::make_unique<Impl>(); |
256 | 286 | return impl_->Open(options); |
|
0 commit comments