mod common;
use tracing::info;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
common::init_tracing();
let ctx = common::create_remote_context();
println!("Zarr-DataFusion GCS Example");
println!("============================\n");
info!("Starting GCS example");
let gcs_url = "gs://gcp-public-data-arco-era5/ar/model-level-1h-0p25deg.zarr-v1";
println!("Registering ERA5 dataset from GCS...");
println!("URL: {}\n", gcs_url);
let start = std::time::Instant::now();
ctx.sql(&format!(
"CREATE EXTERNAL TABLE era5 STORED AS ZARR LOCATION '{}'",
gcs_url
))
.await?
.collect()
.await?;
println!("Table registered in {:?}\n", start.elapsed());
println!("Schema:");
println!("-------");
let df = ctx.sql("DESCRIBE era5").await?;
df.show().await?;
let query = "SELECT latitude, longitude, temperature FROM era5 WHERE time=1095744 AND hybrid=136 LIMIT 50;";
println!("\nExecuting query (optimized - uses statistics, no data scan):");
println!("{}", query);
println!("------------------------------------------------------------------------");
let start = std::time::Instant::now();
let df = ctx.sql(query).await?;
df.show().await?;
println!("Query completed in {:?}\n", start.elapsed());
Ok(())
}