@@ -43,7 +43,7 @@ namespace paimon::parquet {
4343Result<std::unique_ptr<ParquetFormatWriter>> ParquetFormatWriter::Create (
4444 const std::shared_ptr<OutputStream>& output_stream,
4545 const std::shared_ptr<arrow::Schema>& schema,
46- const std::shared_ptr<::parquet::WriterProperties>& writer_properties,
46+ const std::shared_ptr<::parquet::WriterProperties>& writer_properties, uint64_t max_memory_use,
4747 const std::shared_ptr<arrow::MemoryPool>& pool) {
4848 auto out = std::make_shared<ParquetOutputStreamImpl>(output_stream);
4949 ::parquet::ArrowWriterProperties::Builder arrow_properties_builder;
@@ -54,12 +54,15 @@ Result<std::unique_ptr<ParquetFormatWriter>> ParquetFormatWriter::Create(
5454 ::parquet::arrow::FileWriter::Open (*schema, pool.get(), out, writer_properties,
5555 arrow_writer_properties));
5656 return std::unique_ptr<ParquetFormatWriter>(
57- new ParquetFormatWriter (std::move (file_writer), out, schema, pool));
57+ new ParquetFormatWriter (std::move (file_writer), out, schema, max_memory_use, pool));
5858}
5959
6060Status ParquetFormatWriter::AddBatch (ArrowArray* batch) {
6161 PAIMON_ASSIGN_OR_RAISE_FROM_ARROW (std::shared_ptr<::arrow::RecordBatch> record_batch,
6262 arrow::ImportRecordBatch (batch, schema_));
63+ if (static_cast <uint64_t >(pool_->bytes_allocated ()) > max_memory_use_) {
64+ PAIMON_RETURN_NOT_OK_FROM_ARROW (writer_->NewBufferedRowGroup ());
65+ }
6366 PAIMON_RETURN_NOT_OK_FROM_ARROW (writer_->WriteRecordBatch (*record_batch));
6467 total_records_written_ += (*record_batch).num_rows ();
6568 return Status::OK ();
@@ -92,11 +95,13 @@ Result<uint64_t> ParquetFormatWriter::GetEstimateLength() const {
9295ParquetFormatWriter::ParquetFormatWriter (std::unique_ptr<::parquet::arrow::FileWriter> writer,
9396 const std::shared_ptr<ParquetOutputStreamImpl>& out,
9497 const std::shared_ptr<arrow::Schema>& schema,
98+ uint64_t max_memory_use,
9599 const std::shared_ptr<arrow::MemoryPool>& pool)
96100 : pool_(pool),
97101 out_ (out),
98102 writer_(std::move(writer)),
99103 schema_(schema),
100- metrics_(std::make_shared<MetricsImpl>()) {}
104+ metrics_(std::make_shared<MetricsImpl>()),
105+ max_memory_use_(max_memory_use) {}
101106
102107} // namespace paimon::parquet
0 commit comments