1717
1818#include " IcebergWriter.h"
1919
20+ #include " IcebergNestedField.pb.h"
2021#include " IcebergPartitionSpec.pb.h"
2122#include " compute/ProtobufUtils.h"
23+ #include " compute/VeloxBackend.h"
2224#include " compute/iceberg/IcebergFormat.h"
2325#include " config/VeloxConfig.h"
2426#include " utils/ConfigExtractor.h"
@@ -99,9 +101,9 @@ class GlutenIcebergFileNameGenerator : public connector::hive::FileNameGenerator
99101 mutable int32_t fileCount_;
100102};
101103
102- iceberg::IcebergNestedField convertToIcebergNestedField (const gluten::IcebergNestedField& protoField) {
103- IcebergNestedField result;
104- result.id = protoField.id ();
104+ parquet::ParquetFieldId convertToIcebergNestedField (const gluten::IcebergNestedField& protoField) {
105+ parquet::ParquetFieldId result;
106+ result.fieldId = protoField.id ();
105107
106108 // Recursively convert children
107109 result.children .reserve (protoField.children_size ());
@@ -121,7 +123,7 @@ std::shared_ptr<IcebergInsertTableHandle> createIcebergInsertTableHandle(
121123 int64_t taskId,
122124 const std::string& operationId,
123125 std::shared_ptr<const IcebergPartitionSpec> spec,
124- const iceberg::IcebergNestedField & nestedField,
126+ const parquet::ParquetFieldId & nestedField,
125127 facebook::velox::memory::MemoryPool* pool) {
126128 std::vector<std::shared_ptr<const iceberg::IcebergColumnHandle>> columnHandles;
127129
@@ -139,14 +141,12 @@ std::shared_ptr<IcebergInsertTableHandle> createIcebergInsertTableHandle(
139141 columnNames.at (i),
140142 connector::hive::HiveColumnHandle::ColumnType::kPartitionKey ,
141143 columnTypes.at (i),
142- columnTypes.at (i),
143144 nestedField.children [i]));
144145 } else {
145146 columnHandles.push_back (std::make_shared<iceberg::IcebergColumnHandle>(
146147 columnNames.at (i),
147148 connector::hive::HiveColumnHandle::ColumnType::kRegular ,
148149 columnTypes.at (i),
149- columnTypes.at (i),
150150 nestedField.children [i]));
151151 }
152152 }
@@ -157,18 +157,10 @@ std::shared_ptr<IcebergInsertTableHandle> createIcebergInsertTableHandle(
157157 std::shared_ptr<const connector::hive::LocationHandle> locationHandle =
158158 std::make_shared<connector::hive::LocationHandle>(
159159 outputDirectoryPath, outputDirectoryPath, connector::hive::LocationHandle::TableType::kExisting );
160- const std::vector<IcebergSortingColumn> sortedBy;
161160 const std::unordered_map<std::string, std::string> serdeParameters;
161+ auto writeKind = connector::hive::iceberg::IcebergInsertTableHandle::WriteKind::kData ;
162162 return std::make_shared<connector::hive::iceberg::IcebergInsertTableHandle>(
163- columnHandles,
164- locationHandle,
165- spec,
166- pool,
167- fileFormat,
168- sortedBy,
169- compressionKind,
170- serdeParameters,
171- fileNameGenerator);
163+ columnHandles, locationHandle, fileFormat, spec, compressionKind, serdeParameters, writeKind, fileNameGenerator);
172164}
173165
174166} // namespace
@@ -200,20 +192,36 @@ IcebergWriter::IcebergWriter(
200192 connectorSessionProperties_ = createHiveConnectorSessionConfig (veloxCfg);
201193 connectorConfig_ =
202194 std::make_shared<facebook::velox::connector::hive::HiveConfig>(createHiveConnectorConfig (veloxCfg));
195+ std::unordered_map<std::string, std::shared_ptr<facebook::velox::config::ConfigBase>> connectorConfigs;
196+ connectorConfigs[kHiveConnectorId ] = connectorSessionProperties_;
197+ auto queryConfigBase =
198+ std::make_shared<facebook::velox::config::ConfigBase>(std::unordered_map<std::string, std::string>(sparkConfs));
199+ queryCtx_ = facebook::velox::core::QueryCtx::create (
200+ nullptr ,
201+ facebook::velox::core::QueryConfig{facebook::velox::core::QueryConfig::ConfigTag{}, queryConfigBase},
202+ connectorConfigs,
203+ nullptr , // cache
204+ pool_,
205+ nullptr , // spillExecutor
206+ " IcebergWriter" );
207+
208+ auto expressionEvaluator =
209+ std::make_unique<facebook::velox::exec::SimpleExpressionEvaluator>(queryCtx_.get (), pool_.get ());
210+
203211 connectorQueryCtx_ = std::make_unique<connector::ConnectorQueryCtx>(
204212 pool_.get (),
205213 connectorPool_.get (),
206214 connectorSessionProperties_.get (),
207215 nullptr ,
208216 common::PrefixSortConfig (),
209- nullptr ,
217+ std::move (expressionEvaluator) ,
210218 nullptr ,
211219 " query.IcebergDataSink" ,
212220 " task.IcebergDataSink" ,
213221 " planNodeId.IcebergDataSink" ,
214222 0 ,
215223 " " );
216-
224+ auto icebergConfig = std::make_shared<facebook::velox::connector::hive::iceberg::IcebergConfig>(veloxCfg);
217225 dataSink_ = std::make_unique<IcebergDataSink>(
218226 rowType_,
219227 createIcebergInsertTableHandle (
@@ -229,7 +237,8 @@ IcebergWriter::IcebergWriter(
229237 pool_.get ()),
230238 connectorQueryCtx_.get (),
231239 facebook::velox::connector::CommitStrategy::kNoCommit ,
232- connectorConfig_);
240+ connectorConfig_,
241+ icebergConfig);
233242}
234243
235244void IcebergWriter::write (const VeloxColumnarBatch& batch) {
@@ -238,6 +247,9 @@ void IcebergWriter::write(const VeloxColumnarBatch& batch) {
238247
239248 if (inputRowType->size () != rowType_->size ()) {
240249 const auto & children = inputRowVector->children ();
250+
251+ VELOX_CHECK_GE (children.size (), 1 + rowType_->size ());
252+
241253 std::vector<VectorPtr> dataColumns (children.begin () + 1 , children.begin () + 1 + rowType_->size ());
242254
243255 auto filteredRowVector = std::make_shared<RowVector>(
0 commit comments