2020#include " iceberg/parquet/parquet_writer.h"
2121
2222#include < memory>
23+ #include < string_view>
2324
2425#include < arrow/c/bridge.h>
2526#include < arrow/record_batch.h>
27+ #include < arrow/util/compression.h>
2628#include < arrow/util/key_value_metadata.h>
2729#include < parquet/arrow/schema.h>
2830#include < parquet/arrow/writer.h>
@@ -45,21 +47,31 @@ Result<std::shared_ptr<::arrow::io::OutputStream>> OpenOutputStream(
4547
4648Result<::arrow::Compression::type> ParseCompression (const WriterProperties& properties) {
4749 const auto & compression_name = properties.Get (WriterProperties::kParquetCompression );
50+ ::arrow::Compression::type compression;
4851 if (compression_name == " uncompressed" ) {
49- return ::arrow::Compression::UNCOMPRESSED;
52+ compression = ::arrow::Compression::UNCOMPRESSED;
5053 } else if (compression_name == " snappy" ) {
51- return ::arrow::Compression::SNAPPY;
54+ compression = ::arrow::Compression::SNAPPY;
5255 } else if (compression_name == " gzip" ) {
53- return ::arrow::Compression::GZIP;
56+ compression = ::arrow::Compression::GZIP;
5457 } else if (compression_name == " brotli" ) {
55- return ::arrow::Compression::BROTLI;
58+ compression = ::arrow::Compression::BROTLI;
5659 } else if (compression_name == " lz4" ) {
57- return ::arrow::Compression::LZ4;
60+ compression = ::arrow::Compression::LZ4;
5861 } else if (compression_name == " zstd" ) {
59- return ::arrow::Compression::ZSTD;
62+ compression = ::arrow::Compression::ZSTD;
6063 } else {
6164 return InvalidArgument (" Unsupported Parquet compression codec: {}" , compression_name);
6265 }
66+ return compression;
67+ }
68+
69+ Status CheckCompressionAvailable (std::string_view compression_name,
70+ ::arrow::Compression::type compression) {
71+ ICEBERG_PRECHECK (::arrow::util::Codec::IsAvailable (compression),
72+ " Parquet compression codec {} is not available in the current build" ,
73+ compression_name);
74+ return {};
6375}
6476
6577Result<std::optional<int32_t >> ParseCodecLevel (const WriterProperties& properties) {
@@ -98,6 +110,9 @@ class ParquetWriter::Impl {
98110 auto schema_node = std::static_pointer_cast<::parquet::schema::GroupNode>(
99111 schema_descriptor->schema_root ());
100112
113+ ICEBERG_RETURN_UNEXPECTED (CheckCompressionAvailable (
114+ options.properties .Get (WriterProperties::kParquetCompression ), compression));
115+
101116 ICEBERG_ASSIGN_OR_RAISE (output_stream_, OpenOutputStream (options));
102117 auto file_writer = ::parquet::ParquetFileWriter::Open (
103118 output_stream_, std::move (schema_node), std::move (writer_properties),
0 commit comments