iceberg-cpp
Loading...
Searching...
No Matches
table_properties.h
Go to the documentation of this file.
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
20#pragma once
21
24
25#include <limits>
26#include <string>
27#include <unordered_map>
28#include <unordered_set>
29
31#include "iceberg/util/config.h"
32
33namespace iceberg {
34
40class ICEBERG_EXPORT TableProperties : public ConfigBase<TableProperties> {
41 public:
42 template <typename T>
43 using Entry = const ConfigBase<TableProperties>::Entry<T>;
44
45 // Reserved table properties
46
58 inline static Entry<std::string> kFormatVersion{"format-version", ""};
60 inline static Entry<std::string> kUuid{"uuid", ""};
62 inline static Entry<std::string> kSnapshotCount{"snapshot-count", ""};
64 inline static Entry<std::string> kCurrentSnapshotSummary{"current-snapshot-summary",
65 ""};
67 inline static Entry<std::string> kCurrentSnapshotId{"current-snapshot-id", ""};
69 inline static Entry<std::string> kCurrentSnapshotTimestamp{
70 "current-snapshot-timestamp-ms", ""};
72 inline static Entry<std::string> kCurrentSchema{"current-schema", ""};
75 inline static Entry<std::string> kDefaultPartitionSpec{"default-partition-spec", ""};
78 inline static Entry<std::string> kDefaultSortOrder{"default-sort-order", ""};
79
80 // Commit properties
81
82 inline static Entry<int32_t> kCommitNumRetries{"commit.retry.num-retries", 4};
83 inline static Entry<int32_t> kCommitMinRetryWaitMs{"commit.retry.min-wait-ms", 100};
84 inline static Entry<int32_t> kCommitMaxRetryWaitMs{"commit.retry.max-wait-ms",
85 60 * 1000}; // 1 minute
86 inline static Entry<int32_t> kCommitTotalRetryTimeMs{"commit.retry.total-timeout-ms",
87 30 * 60 * 1000}; // 30 minutes
88 inline static Entry<int32_t> kCommitNumStatusChecks{"commit.status-check.num-retries",
89 3};
90 inline static Entry<int64_t> kCommitStatusChecksMinWaitMs{
91 "commit.status-check.min-wait-ms", int64_t{1000}}; // 1 second
92 inline static Entry<int64_t> kCommitStatusChecksMaxWaitMs{
93 "commit.status-check.max-wait-ms", int64_t{60 * 1000}}; // 1 minute
94 inline static Entry<int64_t> kCommitStatusChecksTotalWaitMs{
95 "commit.status-check.total-timeout-ms", int64_t{30 * 60 * 1000}}; // 30 minutes
96
97 // Manifest properties
98
99 inline static Entry<int64_t> kManifestTargetSizeBytes{
100 "commit.manifest.target-size-bytes", int64_t{8 * 1024 * 1024}}; // 8 MB
101 inline static Entry<int32_t> kManifestMinMergeCount{
102 "commit.manifest.min-count-to-merge", 100};
103 inline static Entry<bool> kManifestMergeEnabled{"commit.manifest-merge.enabled", true};
104
105 // File format properties
106
107 inline static Entry<std::string> kDefaultFileFormat{"write.format.default", "parquet"};
108 inline static Entry<std::string> kDeleteDefaultFileFormat{"write.delete.format.default",
109 "parquet"};
110
111 // Parquet properties
112
113 inline static Entry<int32_t> kParquetRowGroupSizeBytes{
114 "write.parquet.row-group-size-bytes", 128 * 1024 * 1024}; // 128 MB
115 inline static Entry<int32_t> kDeleteParquetRowGroupSizeBytes{
116 "write.delete.parquet.row-group-size-bytes", 128 * 1024 * 1024}; // 128 MB
117 inline static Entry<int32_t> kParquetPageSizeBytes{"write.parquet.page-size-bytes",
118 1024 * 1024}; // 1 MB
119 inline static Entry<int32_t> kDeleteParquetPageSizeBytes{
120 "write.delete.parquet.page-size-bytes", 1024 * 1024}; // 1 MB
121 inline static Entry<int32_t> kParquetPageRowLimit{"write.parquet.page-row-limit",
122 20'000};
123 inline static Entry<int32_t> kDeleteParquetPageRowLimit{
124 "write.delete.parquet.page-row-limit", 20'000};
125 inline static Entry<int32_t> kParquetDictSizeBytes{"write.parquet.dict-size-bytes",
126 2 * 1024 * 1024}; // 2 MB
127 inline static Entry<int32_t> kDeleteParquetDictSizeBytes{
128 "write.delete.parquet.dict-size-bytes", 2 * 1024 * 1024}; // 2 MB
129 inline static Entry<std::string> kParquetCompression{"write.parquet.compression-codec",
130 "zstd"};
131 inline static Entry<std::string> kDeleteParquetCompression{
132 "write.delete.parquet.compression-codec", "zstd"};
133 inline static Entry<std::string> kParquetCompressionLevel{
134 "write.parquet.compression-level", ""};
135 inline static Entry<std::string> kDeleteParquetCompressionLevel{
136 "write.delete.parquet.compression-level", ""};
137 inline static Entry<int32_t> kParquetRowGroupCheckMinRecordCount{
138 "write.parquet.row-group-check-min-record-count", 100};
139 inline static Entry<int32_t> kDeleteParquetRowGroupCheckMinRecordCount{
140 "write.delete.parquet.row-group-check-min-record-count", 100};
141 inline static Entry<int32_t> kParquetRowGroupCheckMaxRecordCount{
142 "write.parquet.row-group-check-max-record-count", 10'000};
143 inline static Entry<int32_t> kDeleteParquetRowGroupCheckMaxRecordCount{
144 "write.delete.parquet.row-group-check-max-record-count", 10'000};
145 inline static Entry<int32_t> kParquetBloomFilterMaxBytes{
146 "write.parquet.bloom-filter-max-bytes", 1024 * 1024}; // 1 MB
147 inline static std::string_view kParquetBloomFilterColumnFppPrefix{
148 "write.parquet.bloom-filter-fpp.column."};
149 inline static std::string_view kParquetBloomFilterColumnEnabledPrefix{
150 "write.parquet.bloom-filter-enabled.column."};
151 inline static std::string_view kParquetColumnStatsEnabledPrefix{
152 "write.parquet.stats-enabled.column."};
153
154 // Avro properties
155 inline static Entry<std::string> kAvroCompression{"write.avro.compression-codec",
156 "gzip"};
157 inline static Entry<std::string> kDeleteAvroCompression{
158 "write.delete.avro.compression-codec", "gzip"};
159 inline static Entry<std::string> kAvroCompressionLevel{"write.avro.compression-level",
160 ""};
161 inline static Entry<std::string> kDeleteAvroCompressionLevel{
162 "write.delete.avro.compression-level", ""};
163
164 // ORC properties
165 inline static Entry<int64_t> kOrcStripeSizeBytes{"write.orc.stripe-size-bytes",
166 int64_t{64} * 1024 * 1024};
167 inline static Entry<std::string> kOrcBloomFilterColumns{
168 "write.orc.bloom.filter.columns", ""};
169 inline static Entry<double> kOrcBloomFilterFpp{"write.orc.bloom.filter.fpp", 0.05};
170 inline static Entry<int64_t> kDeleteOrcStripeSizeBytes{
171 "write.delete.orc.stripe-size-bytes", int64_t{64} * 1024 * 1024}; // 64 MB
172 inline static Entry<int64_t> kOrcBlockSizeBytes{"write.orc.block-size-bytes",
173 int64_t{256} * 1024 * 1024}; // 256 MB
174 inline static Entry<int64_t> kDeleteOrcBlockSizeBytes{
175 "write.delete.orc.block-size-bytes", int64_t{256} * 1024 * 1024}; // 256 MB
176 inline static Entry<int32_t> kOrcWriteBatchSize{"write.orc.vectorized.batch-size",
177 1024};
178 inline static Entry<int32_t> kDeleteOrcWriteBatchSize{
179 "write.delete.orc.vectorized.batch-size", 1024};
180 inline static Entry<std::string> kOrcCompression{"write.orc.compression-codec", "zlib"};
181 inline static Entry<std::string> kDeleteOrcCompression{
182 "write.delete.orc.compression-codec", "zlib"};
183 inline static Entry<std::string> kOrcCompressionStrategy{
184 "write.orc.compression-strategy", "speed"};
185 inline static Entry<std::string> kDeleteOrcCompressionStrategy{
186 "write.delete.orc.compression-strategy", "speed"};
187
188 // Read properties
189
190 inline static Entry<int64_t> kSplitSize{"read.split.target-size",
191 int64_t{128} * 1024 * 1024}; // 128 MB
192 inline static Entry<int64_t> kMetadataSplitSize{"read.split.metadata-target-size",
193 int64_t{32} * 1024 * 1024}; // 32 MB
194 inline static Entry<int32_t> kSplitLookback{"read.split.planning-lookback", 10};
195 inline static Entry<int64_t> kSplitOpenFileCost{"read.split.open-file-cost",
196 int64_t{4} * 1024 * 1024}; // 4 MB
197 inline static Entry<bool> kAdaptiveSplitSizeEnabled{"read.split.adaptive-size.enabled",
198 true};
199 inline static Entry<bool> kParquetVectorizationEnabled{
200 "read.parquet.vectorization.enabled", true};
201 inline static Entry<int32_t> kParquetBatchSize{"read.parquet.vectorization.batch-size",
202 5000};
203 inline static Entry<bool> kOrcVectorizationEnabled{"read.orc.vectorization.enabled",
204 false};
205 inline static Entry<int32_t> kOrcBatchSize{"read.orc.vectorization.batch-size", 5000};
206 inline static Entry<std::string> kDataPlanningMode{"read.data-planning-mode", "auto"};
207 inline static Entry<std::string> kDeletePlanningMode{"read.delete-planning-mode",
208 "auto"};
209
210 // Write properties
211
212 inline static Entry<bool> kObjectStoreEnabled{"write.object-storage.enabled", false};
215 inline static Entry<bool> kWriteObjectStorePartitionedPaths{
216 "write.object-storage.partitioned-paths", true};
220 inline static Entry<std::string> kWriteDataLocation{"write.data.path", ""};
224 inline static Entry<std::string> kWriteMetadataLocation{"write.metadata.path", ""};
225 inline static Entry<int32_t> kWritePartitionSummaryLimit{
226 "write.summary.partition-limit", 0};
227 inline static Entry<std::string> kMetadataCompression{
228 "write.metadata.compression-codec", "none"};
229 inline static Entry<int32_t> kMetadataPreviousVersionsMax{
230 "write.metadata.previous-versions-max", 100};
232 inline static Entry<bool> kMetadataDeleteAfterCommitEnabled{
233 "write.metadata.delete-after-commit.enabled", false};
234 inline static Entry<int32_t> kMetricsMaxInferredColumnDefaults{
235 "write.metadata.metrics.max-inferred-column-defaults", 100};
236 inline static constexpr std::string_view kMetricModeColumnConfPrefix =
237 "write.metadata.metrics.column.";
238 inline static Entry<std::string> kDefaultWriteMetricsMode{
239 "write.metadata.metrics.default", "truncate(16)"};
240
241 inline static std::string_view kDefaultNameMapping{"schema.name-mapping.default"};
242
243 inline static Entry<bool> kWriteAuditPublishEnabled{"write.wap.enabled", false};
244 inline static Entry<int64_t> kWriteTargetFileSizeBytes{
245 "write.target-file-size-bytes", int64_t{512} * 1024 * 1024}; // 512 MB
246 inline static Entry<int64_t> kDeleteTargetFileSizeBytes{
247 "write.delete.target-file-size-bytes", int64_t{64} * 1024 * 1024}; // 64 MB
248
249 inline static Entry<bool> kSnapshotIdInheritanceEnabled{
250 "compatibility.snapshot-id-inheritance.enabled", false};
251
252 // Garbage collection properties
253
254 inline static Entry<bool> kGcEnabled{"gc.enabled", true};
255 inline static Entry<int64_t> kMaxSnapshotAgeMs{
256 "history.expire.max-snapshot-age-ms", int64_t{5} * 24 * 60 * 60 * 1000}; // 5 days
257 inline static Entry<int32_t> kMinSnapshotsToKeep{"history.expire.min-snapshots-to-keep",
258 1};
259 inline static Entry<int64_t> kMaxRefAgeMs{"history.expire.max-ref-age-ms",
260 (std::numeric_limits<int64_t>::max)()};
261
262 // Delete/Update/Merge properties
263
264 inline static Entry<std::string> kDeleteGranularity{"write.delete.granularity",
265 "partition"};
266 inline static Entry<std::string> kDeleteIsolationLevel{"write.delete.isolation-level",
267 "serializable"};
268 inline static Entry<std::string> kDeleteMode{"write.delete.mode", "copy-on-write"};
269
270 inline static Entry<std::string> kUpdateIsolationLevel{"write.update.isolation-level",
271 "serializable"};
272 inline static Entry<std::string> kUpdateMode{"write.update.mode", "copy-on-write"};
273
274 inline static Entry<std::string> kMergeIsolationLevel{"write.merge.isolation-level",
275 "serializable"};
276 inline static Entry<std::string> kMergeMode{"write.merge.mode", "copy-on-write"};
277
278 inline static Entry<bool> kUpsertEnabled{"write.upsert.enabled", false};
279
280 // Encryption properties
281
282 inline static Entry<std::string> kEncryptionTableKey{"encryption.key-id", ""};
283 inline static Entry<int32_t> kEncryptionDekLength{"encryption.data-key-length", 16};
284
292 static const std::unordered_set<std::string>& reserved_properties();
293
295 static const std::unordered_set<std::string>& commit_properties();
296
301 static TableProperties FromMap(std::unordered_map<std::string, std::string> properties);
302
303 bool operator==(const TableProperties& other) const {
304 return configs_ == other.configs_;
305 }
306};
307
308} // namespace iceberg
Definition config.h:73
Definition config.h:70
Table properties for Iceberg tables.
Definition table_properties.h:40
static TableProperties FromMap(std::unordered_map< std::string, std::string > properties)
Create a TableProperties instance from a map of key-value pairs.
static const std::unordered_set< std::string > & reserved_properties()
Get the set of reserved table property keys.
static const std::unordered_set< std::string > & commit_properties()
Get the set of commit table property keys.
Provide typed configuration helpers.
Define symbol visibility macros for core Iceberg APIs.
Core Apache Iceberg C++ APIs.
Definition arrow_io_util.h:33