From 305d4468cfb757481b91cdf3bcbb92295cf94feb Mon Sep 17 00:00:00 2001 From: ganesh-skumar Date: Sat, 1 Aug 2026 16:05:44 +0530 Subject: [PATCH 1/7] table eg --- crates/paimon/examples/create_table.rs | 90 ++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 crates/paimon/examples/create_table.rs diff --git a/crates/paimon/examples/create_table.rs b/crates/paimon/examples/create_table.rs new file mode 100644 index 000000000..1c9d7e8fc --- /dev/null +++ b/crates/paimon/examples/create_table.rs @@ -0,0 +1,90 @@ +use std::collections::HashMap; +use std::error::Error; +use std::sync::Arc; + +use arrow_array::{Int32Array, RecordBatch, StringArray}; +use arrow_schema::{DataType as ArrowDataType, Field, Schema as ArrowSchema}; +use paimon::catalog::Identifier; +use paimon::spec::{DataType, IntType, Schema, VarCharType}; +use paimon::{Catalog, CatalogFactory, CatalogOptions, Options}; + +// This example create a paimon table and inserts test data +// set the catalog path and run example using: +// cargo run --package paimon --example create_table +#[tokio::main] +async fn main() -> Result<(), Box> { + // Create local catalog + let catalog = create_catelog().await?; + + // Create new database + catalog + .create_database("my_db", false, HashMap::new()) + .await?; + + // Define table schema and its data types + let schema = Schema::builder() + .column("id", DataType::Int(IntType::new())) + .column("name", DataType::VarChar(VarCharType::string_type())) + .column("city", DataType::VarChar(VarCharType::string_type())) + .column("age", DataType::Int(IntType::new())) + .column("score", DataType::Int(IntType::new())) + .build()?; + + let identifier = Identifier::new("my_db", "users"); + + // create table + catalog.create_table(&identifier, schema, false).await?; + + let table = catalog.get_table(&identifier).await?; + + let builder = table.new_write_builder(); + let txn = builder.new_commit(); + + let mut writer = builder.new_write()?; + + let arrow_schema = Arc::new(ArrowSchema::new(vec![ + Field::new("id", ArrowDataType::Int32, false), + Field::new("name", ArrowDataType::Utf8, false), + Field::new("city", ArrowDataType::Utf8, false), + Field::new("age", ArrowDataType::Int32, false), + Field::new("score", ArrowDataType::Int32, false), + ])); + + // sample data + let batch = RecordBatch::try_new( + arrow_schema, + vec![ + Arc::new(Int32Array::from(vec![1, 2, 3, 4, 5])), + Arc::new(StringArray::from(vec![ + "Alice", "Bob", "Paul", "Diana", "Ethan", + ])), + Arc::new(StringArray::from(vec![ + "New York", + "San Francisco", + "Bengaluru", + "Amsterdam", + "Berlin", + ])), + Arc::new(Int32Array::from(vec![28, 34, 22, 31, 27])), + Arc::new(Int32Array::from(vec![95, 82, 91, 88, 76])), + ], + )?; + + writer.write_arrow_batch(&batch).await?; + + let msg = writer.prepare_commit().await?; + + txn.commit(msg).await?; + + Ok(()) +} + +pub async fn create_catelog() -> Result, Box> { + let mut options = Options::new(); + options.set( + CatalogOptions::WAREHOUSE, + "/home/ganesh/paimon/exp/paimon-rust/crates/paimon/testdata", + ); + let catalog = CatalogFactory::create(options).await?; + Ok(catalog) +} From f4e921b5e2fd16b37f5fe54096f7fe710cc634ea Mon Sep 17 00:00:00 2001 From: ganesh-skumar Date: Sat, 1 Aug 2026 17:22:28 +0530 Subject: [PATCH 2/7] df example --- Cargo.lock | 2 + Cargo.toml | 11 +++- crates/paimon/Cargo.toml | 15 +++++- crates/paimon/examples/create_table.rs | 9 ++-- crates/paimon/examples/datafusion_query.rs | 60 ++++++++++++++++++++++ 5 files changed, 88 insertions(+), 9 deletions(-) create mode 100644 crates/paimon/examples/datafusion_query.rs diff --git a/Cargo.lock b/Cargo.lock index 9f078c3b1..68e1d12bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4570,6 +4570,7 @@ dependencies = [ "chrono", "crc32fast", "crossbeam-channel", + "datafusion", "futures", "hex", "hmac 0.12.1", @@ -4590,6 +4591,7 @@ dependencies = [ "opendal-service-oss", "opendal-service-s3", "orc-rust", + "paimon-datafusion", "paimon-ftindex-core", "paimon-mosaic-core", "paimon-vindex-core", diff --git a/Cargo.toml b/Cargo.toml index fab0a8db9..cb0dff608 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,15 @@ [workspace] resolver = "2" -members = ["crates/paimon", "crates/paimon-rest-server", "crates/integration_tests", "bindings/c", "bindings/python", "crates/integrations/datafusion", "benchmarks/tpcds"] +members = [ + "crates/paimon", + "crates/paimon-rest-server", + "crates/integration_tests", + "bindings/c", + "bindings/python", + "crates/integrations/datafusion", + "benchmarks/tpcds", +] [workspace.package] version = "0.4.0" @@ -41,6 +49,7 @@ arrow-string = "58.0" datafusion = "54.0.0" datafusion-ffi = "54.0.0" paimon = { version = "0.4.0", path = "crates/paimon" } +paimon-datafusion = { path = "crates/integrations/datafusion" } parquet = "58.0" constant_time_eq = ">=0.4.0, <0.5.0" tokio = "1.39.2" diff --git a/crates/paimon/Cargo.toml b/crates/paimon/Cargo.toml index ee5beacfd..50c752afa 100644 --- a/crates/paimon/Cargo.toml +++ b/crates/paimon/Cargo.toml @@ -54,7 +54,10 @@ storage-oss = [ ] storage-s3 = ["dep:opendal-http-transport-reqwest", "dep:opendal-service-s3"] storage-cos = ["dep:opendal-http-transport-reqwest", "dep:opendal-service-cos"] -storage-azdls = ["dep:opendal-http-transport-reqwest", "dep:opendal-service-azdls"] +storage-azdls = [ + "dep:opendal-http-transport-reqwest", + "dep:opendal-service-azdls", +] storage-obs = ["dep:opendal-http-transport-reqwest", "dep:opendal-service-obs"] storage-gcs = ["dep:opendal-http-transport-reqwest", "dep:opendal-service-gcs"] storage-hdfs = ["dep:opendal-service-hdfs-native"] @@ -64,7 +67,13 @@ url = "2.5.2" async-trait = "0.1.81" bytes = "1.7.1" bitflags = "2.6.0" -tokio = { version = "1.39.2", features = ["fs", "io-util", "macros", "sync", "time"] } +tokio = { version = "1.39.2", features = [ + "fs", + "io-util", + "macros", + "sync", + "time", +] } chrono = { version = "0.4.38", features = ["serde"] } serde = { version = "1", features = ["derive", "rc"] } serde_bytes = "0.11.15" @@ -133,3 +142,5 @@ unicode-segmentation = "=1.13.2" axum = { version = "0.7", features = ["macros", "tokio", "http1", "http2"] } rand = "0.8.5" tempfile = "3" +paimon-datafusion = { workspace = true } +datafusion = { workspace = true } diff --git a/crates/paimon/examples/create_table.rs b/crates/paimon/examples/create_table.rs index 1c9d7e8fc..ba559c654 100644 --- a/crates/paimon/examples/create_table.rs +++ b/crates/paimon/examples/create_table.rs @@ -8,12 +8,12 @@ use paimon::catalog::Identifier; use paimon::spec::{DataType, IntType, Schema, VarCharType}; use paimon::{Catalog, CatalogFactory, CatalogOptions, Options}; -// This example create a paimon table and inserts test data +// This example creates a paimon table and inserts test data // set the catalog path and run example using: // cargo run --package paimon --example create_table #[tokio::main] async fn main() -> Result<(), Box> { - // Create local catalog + // Open local catalog let catalog = create_catelog().await?; // Create new database @@ -81,10 +81,7 @@ async fn main() -> Result<(), Box> { pub async fn create_catelog() -> Result, Box> { let mut options = Options::new(); - options.set( - CatalogOptions::WAREHOUSE, - "/home/ganesh/paimon/exp/paimon-rust/crates/paimon/testdata", - ); + options.set(CatalogOptions::WAREHOUSE, "/path-to/testdata"); let catalog = CatalogFactory::create(options).await?; Ok(catalog) } diff --git a/crates/paimon/examples/datafusion_query.rs b/crates/paimon/examples/datafusion_query.rs new file mode 100644 index 000000000..84c7cfd48 --- /dev/null +++ b/crates/paimon/examples/datafusion_query.rs @@ -0,0 +1,60 @@ +use std::error::Error; +use std::sync::Arc; + +use datafusion::prelude::{col, lit, SessionContext}; +use paimon::catalog::Identifier; +use paimon::{Catalog, CatalogFactory, CatalogOptions, Options}; +use paimon_datafusion::PaimonTableProvider; + +// This example demonstrates how to query a Paimon table +// using the DataFusion DataFrame API. +// +// Before running this example, create the sample table at +// examples/create_table +#[tokio::main] +async fn main() -> Result<(), Box> { + // Open the local Paimon catalog + let catalog = create_catelog().await?; + + // Load the users table + let identifier = Identifier::new("my_db", "users"); + let table = catalog.get_table(&identifier).await?; + + // DataFusion TableProvider for the Paimon table + let provider = PaimonTableProvider::try_new(table)?; + + let ctx = SessionContext::new(); + + // Register table + ctx.register_table("user_table", Arc::new(provider))?; + + let df = ctx.table("user_table").await?; + + // Filter users with score >= 90 and select a subset of columns + let df = df.filter(col("score").gt_eq(lit(90)))?.select(vec![ + col("name"), + col("city"), + col("score"), + ])?; + + // Expected output: + // + // +-------+-----------+-------+ + // | name | city | score | + // +-------+-----------+-------+ + // | Alice | New York | 95 | + // | Paul | Bengaluru | 91 | + // +-------+-----------+-------+ + + // Display the results + df.show().await?; + + Ok(()) +} + +pub async fn create_catelog() -> Result, Box> { + let mut options = Options::new(); + options.set(CatalogOptions::WAREHOUSE, "/path-to/testdata"); + let catalog = CatalogFactory::create(options).await?; + Ok(catalog) +} From 43b3e5bba2eb344db4d501fd112de26d1a123266 Mon Sep 17 00:00:00 2001 From: ganesh-skumar Date: Sat, 1 Aug 2026 17:34:21 +0530 Subject: [PATCH 3/7] add license --- crates/paimon/examples/create_table.rs | 17 +++++++++++++++++ crates/paimon/examples/datafusion_query.rs | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/crates/paimon/examples/create_table.rs b/crates/paimon/examples/create_table.rs index ba559c654..a9c2541ef 100644 --- a/crates/paimon/examples/create_table.rs +++ b/crates/paimon/examples/create_table.rs @@ -1,3 +1,20 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + use std::collections::HashMap; use std::error::Error; use std::sync::Arc; diff --git a/crates/paimon/examples/datafusion_query.rs b/crates/paimon/examples/datafusion_query.rs index 84c7cfd48..c6634fa92 100644 --- a/crates/paimon/examples/datafusion_query.rs +++ b/crates/paimon/examples/datafusion_query.rs @@ -1,3 +1,20 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + use std::error::Error; use std::sync::Arc; From f72b4933e9044ce1efcd7c1b2886b27230985548 Mon Sep 17 00:00:00 2001 From: ganesh-skumar Date: Wed, 12 Aug 2026 10:52:27 +0530 Subject: [PATCH 4/7] pr comments --- Cargo.lock | 2 -- Cargo.toml | 1 - .../datafusion}/examples/datafusion_query.rs | 16 +++++++--- crates/paimon/Cargo.toml | 2 -- crates/paimon/examples/create_table.rs | 32 +++++++++++++++---- 5 files changed, 37 insertions(+), 16 deletions(-) rename crates/{paimon => integrations/datafusion}/examples/datafusion_query.rs (79%) diff --git a/Cargo.lock b/Cargo.lock index 68e1d12bd..9f078c3b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4570,7 +4570,6 @@ dependencies = [ "chrono", "crc32fast", "crossbeam-channel", - "datafusion", "futures", "hex", "hmac 0.12.1", @@ -4591,7 +4590,6 @@ dependencies = [ "opendal-service-oss", "opendal-service-s3", "orc-rust", - "paimon-datafusion", "paimon-ftindex-core", "paimon-mosaic-core", "paimon-vindex-core", diff --git a/Cargo.toml b/Cargo.toml index cb0dff608..08fe20d3c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,7 +49,6 @@ arrow-string = "58.0" datafusion = "54.0.0" datafusion-ffi = "54.0.0" paimon = { version = "0.4.0", path = "crates/paimon" } -paimon-datafusion = { path = "crates/integrations/datafusion" } parquet = "58.0" constant_time_eq = ">=0.4.0, <0.5.0" tokio = "1.39.2" diff --git a/crates/paimon/examples/datafusion_query.rs b/crates/integrations/datafusion/examples/datafusion_query.rs similarity index 79% rename from crates/paimon/examples/datafusion_query.rs rename to crates/integrations/datafusion/examples/datafusion_query.rs index c6634fa92..f66cce5d7 100644 --- a/crates/paimon/examples/datafusion_query.rs +++ b/crates/integrations/datafusion/examples/datafusion_query.rs @@ -27,11 +27,19 @@ use paimon_datafusion::PaimonTableProvider; // using the DataFusion DataFrame API. // // Before running this example, create the sample table at -// examples/create_table +// examples/create_table, then pass the catalog warehouse path: +// cargo run --package paimon-datafusion --example datafusion_query -- /path/to/warehouse #[tokio::main] async fn main() -> Result<(), Box> { + let warehouse = std::env::args().nth(1).ok_or_else(|| { + std::io::Error::new( + std::io::ErrorKind::InvalidInput, + "usage: cargo run --package paimon-datafusion --example datafusion_query -- ", + ) + })?; + // Open the local Paimon catalog - let catalog = create_catelog().await?; + let catalog = create_catelog(warehouse).await?; // Load the users table let identifier = Identifier::new("my_db", "users"); @@ -69,9 +77,9 @@ async fn main() -> Result<(), Box> { Ok(()) } -pub async fn create_catelog() -> Result, Box> { +pub async fn create_catelog(warehouse: String) -> Result, Box> { let mut options = Options::new(); - options.set(CatalogOptions::WAREHOUSE, "/path-to/testdata"); + options.set(CatalogOptions::WAREHOUSE, warehouse); let catalog = CatalogFactory::create(options).await?; Ok(catalog) } diff --git a/crates/paimon/Cargo.toml b/crates/paimon/Cargo.toml index 50c752afa..934adff05 100644 --- a/crates/paimon/Cargo.toml +++ b/crates/paimon/Cargo.toml @@ -142,5 +142,3 @@ unicode-segmentation = "=1.13.2" axum = { version = "0.7", features = ["macros", "tokio", "http1", "http2"] } rand = "0.8.5" tempfile = "3" -paimon-datafusion = { workspace = true } -datafusion = { workspace = true } diff --git a/crates/paimon/examples/create_table.rs b/crates/paimon/examples/create_table.rs index a9c2541ef..937d7cf7b 100644 --- a/crates/paimon/examples/create_table.rs +++ b/crates/paimon/examples/create_table.rs @@ -26,16 +26,23 @@ use paimon::spec::{DataType, IntType, Schema, VarCharType}; use paimon::{Catalog, CatalogFactory, CatalogOptions, Options}; // This example creates a paimon table and inserts test data -// set the catalog path and run example using: -// cargo run --package paimon --example create_table +// Run the example by passing the catalog warehouse path after `--`: +// cargo run --package paimon --example create_table -- /path/to/warehouse #[tokio::main] async fn main() -> Result<(), Box> { + let warehouse = std::env::args().nth(1).ok_or_else(|| { + std::io::Error::new( + std::io::ErrorKind::InvalidInput, + "usage: cargo run --package paimon --example create_table -- ", + ) + })?; + // Open local catalog - let catalog = create_catelog().await?; + let catalog = create_catelog(warehouse).await?; // Create new database catalog - .create_database("my_db", false, HashMap::new()) + .create_database("my_db", true, HashMap::new()) .await?; // Define table schema and its data types @@ -49,7 +56,18 @@ async fn main() -> Result<(), Box> { let identifier = Identifier::new("my_db", "users"); - // create table + // Check if table exists in catalog + let table_exists = match catalog.get_table(&identifier).await { + Ok(_) => true, + Err(paimon::Error::TableNotExist { .. }) => false, + Err(error) => return Err(error.into()), + }; + + // if exists, drop and create fresh table and data + if table_exists { + catalog.drop_table(&identifier, false).await?; + } + catalog.create_table(&identifier, schema, false).await?; let table = catalog.get_table(&identifier).await?; @@ -96,9 +114,9 @@ async fn main() -> Result<(), Box> { Ok(()) } -pub async fn create_catelog() -> Result, Box> { +pub async fn create_catelog(warehouse: String) -> Result, Box> { let mut options = Options::new(); - options.set(CatalogOptions::WAREHOUSE, "/path-to/testdata"); + options.set(CatalogOptions::WAREHOUSE, warehouse); let catalog = CatalogFactory::create(options).await?; Ok(catalog) } From d9822f6462327bd1fecb25849dbdc0ad5d746b75 Mon Sep 17 00:00:00 2001 From: ganesh-skumar Date: Wed, 12 Aug 2026 14:45:27 +0530 Subject: [PATCH 5/7] pr comments 2 --- .../datafusion/examples/datafusion_query.rs | 4 ++-- crates/paimon/examples/create_table.rs | 22 ++++++++++++++----- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/crates/integrations/datafusion/examples/datafusion_query.rs b/crates/integrations/datafusion/examples/datafusion_query.rs index f66cce5d7..b3873a003 100644 --- a/crates/integrations/datafusion/examples/datafusion_query.rs +++ b/crates/integrations/datafusion/examples/datafusion_query.rs @@ -39,7 +39,7 @@ async fn main() -> Result<(), Box> { })?; // Open the local Paimon catalog - let catalog = create_catelog(warehouse).await?; + let catalog = create_catalog(warehouse).await?; // Load the users table let identifier = Identifier::new("my_db", "users"); @@ -77,7 +77,7 @@ async fn main() -> Result<(), Box> { Ok(()) } -pub async fn create_catelog(warehouse: String) -> Result, Box> { +pub async fn create_catalog(warehouse: String) -> Result, Box> { let mut options = Options::new(); options.set(CatalogOptions::WAREHOUSE, warehouse); let catalog = CatalogFactory::create(options).await?; diff --git a/crates/paimon/examples/create_table.rs b/crates/paimon/examples/create_table.rs index 937d7cf7b..374865114 100644 --- a/crates/paimon/examples/create_table.rs +++ b/crates/paimon/examples/create_table.rs @@ -30,15 +30,19 @@ use paimon::{Catalog, CatalogFactory, CatalogOptions, Options}; // cargo run --package paimon --example create_table -- /path/to/warehouse #[tokio::main] async fn main() -> Result<(), Box> { - let warehouse = std::env::args().nth(1).ok_or_else(|| { + let mut args = std::env::args().skip(1); + + let warehouse = args.next().ok_or_else(|| { std::io::Error::new( std::io::ErrorKind::InvalidInput, - "usage: cargo run --package paimon --example create_table -- ", + "usage: cargo run --package paimon --example create_table -- ", ) })?; + let overwrite = args.any(|arg| arg == "--overwrite"); + // Open local catalog - let catalog = create_catelog(warehouse).await?; + let catalog = create_catalog(warehouse).await?; // Create new database catalog @@ -63,11 +67,17 @@ async fn main() -> Result<(), Box> { Err(error) => return Err(error.into()), }; - // if exists, drop and create fresh table and data if table_exists { + if !overwrite { + return Err(format!( + "table {} already exists, pass --overwrite to automatically drop and re-create it", + identifier + ) + .into()); + } + catalog.drop_table(&identifier, false).await?; } - catalog.create_table(&identifier, schema, false).await?; let table = catalog.get_table(&identifier).await?; @@ -114,7 +124,7 @@ async fn main() -> Result<(), Box> { Ok(()) } -pub async fn create_catelog(warehouse: String) -> Result, Box> { +pub async fn create_catalog(warehouse: String) -> Result, Box> { let mut options = Options::new(); options.set(CatalogOptions::WAREHOUSE, warehouse); let catalog = CatalogFactory::create(options).await?; From a4196cceee36a81e06e2879b2b6ad40f3fdfeffb Mon Sep 17 00:00:00 2001 From: ganesh-skumar Date: Thu, 13 Aug 2026 18:26:58 +0530 Subject: [PATCH 6/7] update doc --- crates/paimon/examples/create_table.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/paimon/examples/create_table.rs b/crates/paimon/examples/create_table.rs index 374865114..baefbb272 100644 --- a/crates/paimon/examples/create_table.rs +++ b/crates/paimon/examples/create_table.rs @@ -26,8 +26,10 @@ use paimon::spec::{DataType, IntType, Schema, VarCharType}; use paimon::{Catalog, CatalogFactory, CatalogOptions, Options}; // This example creates a paimon table and inserts test data -// Run the example by passing the catalog warehouse path after `--`: -// cargo run --package paimon --example create_table -- /path/to/warehouse +// Run the example by passing the catalog warehouse path first after `--`: +// Eg: cargo run --package paimon --example create_table -- /path/to/warehouse --overwrite +// Use optional `--overwrite` after the warehouse path to automatically drop and re-create +// the table if it already exists. #[tokio::main] async fn main() -> Result<(), Box> { let mut args = std::env::args().skip(1); @@ -35,7 +37,7 @@ async fn main() -> Result<(), Box> { let warehouse = args.next().ok_or_else(|| { std::io::Error::new( std::io::ErrorKind::InvalidInput, - "usage: cargo run --package paimon --example create_table -- ", + "usage: cargo run --package paimon --example create_table -- --overwrite", ) })?; From c59e8d2eb18ae442d7ceb9f21c45b6f5bf4a9331 Mon Sep 17 00:00:00 2001 From: ganesh-skumar Date: Thu, 13 Aug 2026 18:27:30 +0530 Subject: [PATCH 7/7] format --- crates/paimon/examples/create_table.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/paimon/examples/create_table.rs b/crates/paimon/examples/create_table.rs index baefbb272..5f9e8724b 100644 --- a/crates/paimon/examples/create_table.rs +++ b/crates/paimon/examples/create_table.rs @@ -28,7 +28,7 @@ use paimon::{Catalog, CatalogFactory, CatalogOptions, Options}; // This example creates a paimon table and inserts test data // Run the example by passing the catalog warehouse path first after `--`: // Eg: cargo run --package paimon --example create_table -- /path/to/warehouse --overwrite -// Use optional `--overwrite` after the warehouse path to automatically drop and re-create +// Use optional --overwrite flag after the warehouse path to automatically drop and re-create // the table if it already exists. #[tokio::main] async fn main() -> Result<(), Box> {