This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new 412ca4e1ff Add clickbench parquet based queries to sql_planner 
benchmark (#13103)
412ca4e1ff is described below

commit 412ca4e1ffe0a005cb772393f1e920ab395a6200
Author: Bruce Ritchie <[email protected]>
AuthorDate: Sat Oct 26 07:38:32 2024 -0400

    Add clickbench parquet based queries to sql_planner benchmark (#13103)
    
    * Add clickbench parquet based queries to sql_planner benchmark.
    
    * Cargo fmt.
    
    * Commented out most logical_plan tests & updated code to allow for running 
from either cargo or via target/release/deps/sql_planner-xyz
---
 datafusion/core/benches/sql_planner.rs | 121 +++++++++++++++++++++++++++++----
 1 file changed, 107 insertions(+), 14 deletions(-)

diff --git a/datafusion/core/benches/sql_planner.rs 
b/datafusion/core/benches/sql_planner.rs
index 6f9cf02873..140e266a02 100644
--- a/datafusion/core/benches/sql_planner.rs
+++ b/datafusion/core/benches/sql_planner.rs
@@ -15,22 +15,31 @@
 // specific language governing permissions and limitations
 // under the License.
 
+extern crate arrow;
 #[macro_use]
 extern crate criterion;
-extern crate arrow;
 extern crate datafusion;
 
 mod data_utils;
+
 use crate::criterion::Criterion;
 use arrow::datatypes::{DataType, Field, Fields, Schema};
 use datafusion::datasource::MemTable;
 use datafusion::execution::context::SessionContext;
+use itertools::Itertools;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+use std::path::PathBuf;
 use std::sync::Arc;
 use test_utils::tpcds::tpcds_schemas;
 use test_utils::tpch::tpch_schemas;
 use test_utils::TableDef;
 use tokio::runtime::Runtime;
 
+const BENCHMARKS_PATH_1: &str = "../../benchmarks/";
+const BENCHMARKS_PATH_2: &str = "./benchmarks/";
+const CLICKBENCH_DATA_PATH: &str = "data/hits_partitioned/";
+
 /// Create a logical plan from the specified sql
 fn logical_plan(ctx: &SessionContext, sql: &str) {
     let rt = Runtime::new().unwrap();
@@ -91,7 +100,37 @@ fn register_defs(ctx: SessionContext, defs: Vec<TableDef>) 
-> SessionContext {
     ctx
 }
 
+fn register_clickbench_hits_table() -> SessionContext {
+    let ctx = SessionContext::new();
+    let rt = Runtime::new().unwrap();
+
+    // use an external table for clickbench benchmarks
+    let path =
+        if 
PathBuf::from(format!("{BENCHMARKS_PATH_1}{CLICKBENCH_DATA_PATH}")).exists() {
+            format!("{BENCHMARKS_PATH_1}{CLICKBENCH_DATA_PATH}")
+        } else {
+            format!("{BENCHMARKS_PATH_2}{CLICKBENCH_DATA_PATH}")
+        };
+
+    let sql = format!("CREATE EXTERNAL TABLE hits STORED AS PARQUET LOCATION 
'{path}'");
+
+    rt.block_on(ctx.sql(&sql)).unwrap();
+
+    let count =
+        rt.block_on(async { 
ctx.table("hits").await.unwrap().count().await.unwrap() });
+    assert!(count > 0);
+    ctx
+}
+
 fn criterion_benchmark(c: &mut Criterion) {
+    // verify that we can load the clickbench data prior to running the 
benchmark
+    if 
!PathBuf::from(format!("{BENCHMARKS_PATH_1}{CLICKBENCH_DATA_PATH}")).exists()
+        && 
!PathBuf::from(format!("{BENCHMARKS_PATH_2}{CLICKBENCH_DATA_PATH}")).exists()
+    {
+        panic!("benchmarks/data/hits_partitioned/ could not be loaded. Please 
run \
+         'benchmarks/bench.sh data clickbench_partitioned' prior to running 
this benchmark")
+    }
+
     let ctx = create_context();
 
     // Test simplest
@@ -235,9 +274,15 @@ fn criterion_benchmark(c: &mut Criterion) {
         "q16", "q17", "q18", "q19", "q20", "q21", "q22",
     ];
 
+    let benchmarks_path = if PathBuf::from(BENCHMARKS_PATH_1).exists() {
+        BENCHMARKS_PATH_1
+    } else {
+        BENCHMARKS_PATH_2
+    };
+
     for q in tpch_queries {
         let sql =
-            
std::fs::read_to_string(format!("../../benchmarks/queries/{q}.sql")).unwrap();
+            
std::fs::read_to_string(format!("{benchmarks_path}queries/{q}.sql")).unwrap();
         c.bench_function(&format!("physical_plan_tpch_{}", q), |b| {
             b.iter(|| physical_plan(&tpch_ctx, &sql))
         });
@@ -246,7 +291,7 @@ fn criterion_benchmark(c: &mut Criterion) {
     let all_tpch_sql_queries = tpch_queries
         .iter()
         .map(|q| {
-            
std::fs::read_to_string(format!("../../benchmarks/queries/{q}.sql")).unwrap()
+            
std::fs::read_to_string(format!("{benchmarks_path}queries/{q}.sql")).unwrap()
         })
         .collect::<Vec<_>>();
 
@@ -258,20 +303,25 @@ fn criterion_benchmark(c: &mut Criterion) {
         })
     });
 
-    c.bench_function("logical_plan_tpch_all", |b| {
-        b.iter(|| {
-            for sql in &all_tpch_sql_queries {
-                logical_plan(&tpch_ctx, sql)
-            }
-        })
-    });
+    // c.bench_function("logical_plan_tpch_all", |b| {
+    //     b.iter(|| {
+    //         for sql in &all_tpch_sql_queries {
+    //             logical_plan(&tpch_ctx, sql)
+    //         }
+    //     })
+    // });
 
     // --- TPC-DS ---
 
     let tpcds_ctx = register_defs(SessionContext::new(), tpcds_schemas());
+    let tests_path = if PathBuf::from("./tests/").exists() {
+        "./tests/"
+    } else {
+        "datafusion/core/tests/"
+    };
 
     let raw_tpcds_sql_queries = (1..100)
-        .map(|q| 
std::fs::read_to_string(format!("./tests/tpc-ds/{q}.sql")).unwrap())
+        .map(|q| 
std::fs::read_to_string(format!("{tests_path}tpc-ds/{q}.sql")).unwrap())
         .collect::<Vec<_>>();
 
     // some queries have multiple statements
@@ -288,10 +338,53 @@ fn criterion_benchmark(c: &mut Criterion) {
         })
     });
 
-    c.bench_function("logical_plan_tpcds_all", |b| {
+    // c.bench_function("logical_plan_tpcds_all", |b| {
+    //     b.iter(|| {
+    //         for sql in &all_tpcds_sql_queries {
+    //             logical_plan(&tpcds_ctx, sql)
+    //         }
+    //     })
+    // });
+
+    // -- clickbench --
+
+    let queries_file =
+        
File::open(format!("{benchmarks_path}queries/clickbench/queries.sql")).unwrap();
+    let extended_file =
+        
File::open(format!("{benchmarks_path}queries/clickbench/extended.sql")).unwrap();
+
+    let clickbench_queries: Vec<String> = BufReader::new(queries_file)
+        .lines()
+        .chain(BufReader::new(extended_file).lines())
+        .map(|l| l.expect("Could not parse line"))
+        .collect_vec();
+
+    let clickbench_ctx = register_clickbench_hits_table();
+
+    // for (i, sql) in clickbench_queries.iter().enumerate() {
+    //     c.bench_function(&format!("logical_plan_clickbench_q{}", i + 1), 
|b| {
+    //         b.iter(|| logical_plan(&clickbench_ctx, sql))
+    //     });
+    // }
+
+    for (i, sql) in clickbench_queries.iter().enumerate() {
+        c.bench_function(&format!("physical_plan_clickbench_q{}", i + 1), |b| {
+            b.iter(|| physical_plan(&clickbench_ctx, sql))
+        });
+    }
+
+    // c.bench_function("logical_plan_clickbench_all", |b| {
+    //     b.iter(|| {
+    //         for sql in &clickbench_queries {
+    //             logical_plan(&clickbench_ctx, sql)
+    //         }
+    //     })
+    // });
+
+    c.bench_function("physical_plan_clickbench_all", |b| {
         b.iter(|| {
-            for sql in &all_tpcds_sql_queries {
-                logical_plan(&tpcds_ctx, sql)
+            for sql in &clickbench_queries {
+                physical_plan(&clickbench_ctx, sql)
             }
         })
     });


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to