From a039bf8b87346d52e737163de7e97e3b2dcb2064 Mon Sep 17 00:00:00 2001 From: STWang Date: Tue, 17 Mar 2026 14:42:57 -0600 Subject: [PATCH 1/4] move benchmark folder --- asap-tools/execution-utilities/.gitignore | 3 + .../asap_query_latency/README.md | 205 +++++++ .../asap_quantile_queries.sql | 100 ++++ .../clickhouse_quantile_queries.sql | 530 ++++++++++++++++++ .../asap_query_latency/inference_config.yaml | 80 +++ .../asap_query_latency/plot_latency.py | 66 +++ .../asap_query_latency/run_benchmark.py | 411 ++++++++++++++ .../asap_query_latency/streaming_config.yaml | 136 +++++ .../clickhouse-benchmark-pipeline/README.md | 18 +- .../clickhouse/clickbench_init.sql | 5 +- .../clickhouse-benchmark-pipeline/config.env | 4 +- .../data_exporter/src/main.rs | 139 +++-- .../scripts/generate_data.sh | 29 +- .../scripts/init_clickhouse.sh | 4 +- 14 files changed, 1652 insertions(+), 78 deletions(-) create mode 100644 asap-tools/execution-utilities/asap_query_latency/README.md create mode 100644 asap-tools/execution-utilities/asap_query_latency/asap_quantile_queries.sql create mode 100644 asap-tools/execution-utilities/asap_query_latency/clickhouse_quantile_queries.sql create mode 100644 asap-tools/execution-utilities/asap_query_latency/inference_config.yaml create mode 100644 asap-tools/execution-utilities/asap_query_latency/plot_latency.py create mode 100755 asap-tools/execution-utilities/asap_query_latency/run_benchmark.py create mode 100644 asap-tools/execution-utilities/asap_query_latency/streaming_config.yaml diff --git a/asap-tools/execution-utilities/.gitignore b/asap-tools/execution-utilities/.gitignore index 533dc14..c8760c7 100644 --- a/asap-tools/execution-utilities/.gitignore +++ b/asap-tools/execution-utilities/.gitignore @@ -7,3 +7,6 @@ clickhouse-benchmark-pipeline/benchmark_results/ **/data/ + +**/*.csv +**/*.png diff --git a/asap-tools/execution-utilities/asap_query_latency/README.md b/asap-tools/execution-utilities/asap_query_latency/README.md new file mode 100644 index 0000000..042deed --- /dev/null +++ b/asap-tools/execution-utilities/asap_query_latency/README.md @@ -0,0 +1,205 @@ +# ASAP Benchmark: ClickBench `hits` Dataset + +Measures ASAP query latency (KLL sketch) against 50 fixed-timestamp QUANTILE 0.95 queries over 1M ClickBench rows. + +## Data Flow + +``` +hits.json.gz + └─> data_exporter (sort by EventTime → Kafka hits topic) + | + ┌────────────────┴────────────────┐ + ↓ ↓ + Arroyo (KLL sketch, 1-sec windows) ClickHouse (Kafka engine) + | + sketch_topic (Kafka) + | + QueryEngineRust :8088 + | + run_benchmark.py → asap_results.csv +``` + +--- + +## Prerequisites + +```bash +export INSTALL_DIR=/scratch/sketch_db_for_prometheus +``` + +### Build binaries (one-time) + +```bash +# QueryEngineRust +cd ~/asap-internal/QueryEngineRust && cargo build --release + +# data_exporter +cd ~/asap-internal/ExecutionUtilities/clickhouse-benchmark-pipeline/data_exporter +cargo build --release +``` + +### Download and chunk ClickBench data (one-time) + +```bash +cd ~/asap-internal/ExecutionUtilities/clickhouse-benchmark-pipeline +python3 clickbench_importer/download_data.py + +DATA_DIR=~/asap-internal/ExecutionUtilities/clickhouse-benchmark-pipeline/clickbench_importer/data +cd $DATA_DIR +mv hits.json.gz hits_full.json.gz +zcat hits_full.json.gz | head -n 1000000 | gzip > hits.json.gz +``` + +### Python dependencies (one-time) + +```bash +pip3 install --user requests matplotlib numpy +pip3 install --user ~/asap-internal/CommonDependencies/dependencies/py/promql_utilities/ +``` + +--- + +## Run the Pipeline + +**Order matters**: create the Arroyo pipeline before producing data (connection table uses `offset: latest`). + +### Step 1 — Start Kafka + +```bash +~/asap-internal/Utilities/installation/kafka/run.sh $INSTALL_DIR/kafka +``` + +### Step 2 — Create Kafka topics + +```bash +KAFKA=$INSTALL_DIR/kafka/bin +$KAFKA/kafka-topics.sh --bootstrap-server localhost:9092 --create \ + --topic hits --partitions 1 --replication-factor 1 +$KAFKA/kafka-topics.sh --bootstrap-server localhost:9092 --create \ + --topic sketch_topic --partitions 1 --replication-factor 1 \ + --config max.message.bytes=20971520 +``` + +### Step 3 — Start ClickHouse + +```bash +~/asap-internal/Utilities/installation/clickhouse/run.sh $INSTALL_DIR +``` + +### Step 4 — Init ClickHouse tables + +```bash +cd ~/asap-internal/ExecutionUtilities/clickhouse-benchmark-pipeline +CLICKHOUSE_BIN=$INSTALL_DIR/clickhouse bash scripts/init_clickhouse.sh +``` + +### Step 5 — Start Arroyo cluster + +```bash +~/asap-internal/arroyo/target/release/arroyo \ + --config ~/asap-internal/ArroyoSketch/config.yaml cluster \ + > /tmp/arroyo.log 2>&1 & +``` + +### Step 6 — Create ArroyoSketch pipeline + +```bash +cd ~/asap-internal/ArroyoSketch +python3 run_arroyosketch.py \ + --source_type kafka \ + --kafka_input_format json \ + --input_kafka_topic hits \ + --output_format json \ + --pipeline_name asap_hits_pipeline \ + --config_file_path ~/asap-internal/ExecutionUtilities/asap_query_latency/streaming_config.yaml \ + --output_kafka_topic sketch_topic \ + --output_dir ./outputs \ + --parallelism 1 \ + --query_language sql +``` + +### Step 7 — Start QueryEngineRust + +```bash +cd ~/asap-internal/QueryEngineRust +nohup ./target/release/query_engine_rust \ + --kafka-topic sketch_topic --input-format json \ + --config ~/asap-internal/ExecutionUtilities/asap_query_latency/inference_config.yaml \ + --streaming-config ~/asap-internal/ExecutionUtilities/asap_query_latency/streaming_config.yaml \ + --http-port 8088 --delete-existing-db --log-level DEBUG \ + --output-dir ./output --streaming-engine arroyo \ + --query-language SQL --lock-strategy per-key \ + --prometheus-scrape-interval 1 > /tmp/query_engine.log 2>&1 & +``` + +### Step 8 — Produce ClickBench data + +`data_exporter` reads all 1M records, transforms them (RFC3339 EventTime, stringify integer fields), sorts by EventTime, then sends to Kafka with event-time Kafka timestamps. This enables Arroyo's watermark to advance correctly for event-time windowing. + +```bash +cd ~/asap-internal/ExecutionUtilities/clickhouse-benchmark-pipeline +TOTAL_RECORDS=1000000 DATA_MODE=clickbench bash scripts/generate_data.sh +``` + +Wait for completion before running the benchmark. + +### Step 9 — Run ASAP benchmark + +```bash +cd ~/asap-internal/ExecutionUtilities/asap_query_latency +./run_benchmark.py \ + --mode asap \ + --sql-file asap_quantile_queries.sql \ + --output asap_results.csv +``` + +### Step 10 — Run baseline benchmark (ClickHouse) + +Wait for Step 8 data ingestion to complete, then verify ClickHouse has all rows: + +```bash +$INSTALL_DIR/clickhouse client --query "SELECT count(*) FROM hits" +# Should return 1000000 +``` + +Run the benchmark: + +```bash +cd ~/asap-internal/ExecutionUtilities/asap_query_latency +./run_benchmark.py \ + --mode baseline \ + --sql-file clickhouse_quantile_queries.sql \ + --output baseline_results.csv \ + --clickhouse-url http://localhost:8123 +``` + +--- + +## Reset (re-run from scratch) + +```bash +# Kill workers and Arroyo cluster +pkill -f "arroyo"; pkill -f "query_engine_rust"; pkill -f "data_exporter" +sleep 2 + +# Stop Kafka and ClickHouse +pkill -f "kafka-server-start.sh"; pkill -f "clickhouse server" +sleep 2 + +# Clear Arroyo checkpoint state (REQUIRED — old watermark causes all windows to be skipped) +rm -rf /tmp/arroyo/ + +# Delete Kafka topics +KAFKA=$INSTALL_DIR/kafka/bin +$KAFKA/kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic hits +$KAFKA/kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic sketch_topic + +# Delete old Arroyo pipeline +cd ~/asap-internal/ArroyoSketch +python3 delete_pipeline.py --all_pipelines + +# Clear ClickHouse table +$INSTALL_DIR/clickhouse client --query "TRUNCATE TABLE hits" +``` + +Then repeat Steps 1–9. diff --git a/asap-tools/execution-utilities/asap_query_latency/asap_quantile_queries.sql b/asap-tools/execution-utilities/asap_query_latency/asap_quantile_queries.sql new file mode 100644 index 0000000..c6e90f6 --- /dev/null +++ b/asap-tools/execution-utilities/asap_query_latency/asap_quantile_queries.sql @@ -0,0 +1,100 @@ +-- T000: quantile window ending at 2013-07-14 20:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-14 20:00:00') AND '2013-07-14 20:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T001: quantile window ending at 2013-07-14 20:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-14 20:30:00') AND '2013-07-14 20:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T002: quantile window ending at 2013-07-14 21:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-14 21:00:00') AND '2013-07-14 21:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T003: quantile window ending at 2013-07-14 21:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-14 21:30:00') AND '2013-07-14 21:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T004: quantile window ending at 2013-07-14 22:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-14 22:00:00') AND '2013-07-14 22:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T005: quantile window ending at 2013-07-14 22:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-14 22:30:00') AND '2013-07-14 22:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T006: quantile window ending at 2013-07-14 23:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-14 23:00:00') AND '2013-07-14 23:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T007: quantile window ending at 2013-07-14 23:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-14 23:30:00') AND '2013-07-14 23:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T008: quantile window ending at 2013-07-15 00:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 00:00:00') AND '2013-07-15 00:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T009: quantile window ending at 2013-07-15 00:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 00:30:00') AND '2013-07-15 00:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T010: quantile window ending at 2013-07-15 01:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 01:00:00') AND '2013-07-15 01:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T011: quantile window ending at 2013-07-15 01:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 01:30:00') AND '2013-07-15 01:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T012: quantile window ending at 2013-07-15 02:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 02:00:00') AND '2013-07-15 02:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T013: quantile window ending at 2013-07-15 02:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 02:30:00') AND '2013-07-15 02:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T014: quantile window ending at 2013-07-15 03:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 03:00:00') AND '2013-07-15 03:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T015: quantile window ending at 2013-07-15 03:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 03:30:00') AND '2013-07-15 03:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T016: quantile window ending at 2013-07-15 04:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 04:00:00') AND '2013-07-15 04:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T017: quantile window ending at 2013-07-15 04:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 04:30:00') AND '2013-07-15 04:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T018: quantile window ending at 2013-07-15 05:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 05:00:00') AND '2013-07-15 05:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T019: quantile window ending at 2013-07-15 05:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 05:30:00') AND '2013-07-15 05:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T020: quantile window ending at 2013-07-15 06:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 06:00:00') AND '2013-07-15 06:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T021: quantile window ending at 2013-07-15 06:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 06:30:00') AND '2013-07-15 06:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T022: quantile window ending at 2013-07-15 07:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 07:00:00') AND '2013-07-15 07:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T023: quantile window ending at 2013-07-15 07:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 07:30:00') AND '2013-07-15 07:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T024: quantile window ending at 2013-07-15 08:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 08:00:00') AND '2013-07-15 08:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T025: quantile window ending at 2013-07-15 08:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 08:30:00') AND '2013-07-15 08:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T026: quantile window ending at 2013-07-15 09:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 09:00:00') AND '2013-07-15 09:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T027: quantile window ending at 2013-07-15 09:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 09:30:00') AND '2013-07-15 09:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T028: quantile window ending at 2013-07-15 10:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 10:00:00') AND '2013-07-15 10:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T029: quantile window ending at 2013-07-15 10:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 10:30:00') AND '2013-07-15 10:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T030: quantile window ending at 2013-07-15 11:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 11:00:00') AND '2013-07-15 11:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T031: quantile window ending at 2013-07-15 11:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 11:30:00') AND '2013-07-15 11:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T032: quantile window ending at 2013-07-15 12:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 12:00:00') AND '2013-07-15 12:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T033: quantile window ending at 2013-07-15 12:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 12:30:00') AND '2013-07-15 12:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T034: quantile window ending at 2013-07-15 13:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 13:00:00') AND '2013-07-15 13:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T035: quantile window ending at 2013-07-15 13:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 13:30:00') AND '2013-07-15 13:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T036: quantile window ending at 2013-07-15 14:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 14:00:00') AND '2013-07-15 14:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T037: quantile window ending at 2013-07-15 14:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 14:30:00') AND '2013-07-15 14:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T038: quantile window ending at 2013-07-15 15:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 15:00:00') AND '2013-07-15 15:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T039: quantile window ending at 2013-07-15 15:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 15:30:00') AND '2013-07-15 15:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T040: quantile window ending at 2013-07-15 16:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 16:00:00') AND '2013-07-15 16:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T041: quantile window ending at 2013-07-15 16:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 16:30:00') AND '2013-07-15 16:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T042: quantile window ending at 2013-07-15 17:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 17:00:00') AND '2013-07-15 17:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T043: quantile window ending at 2013-07-15 17:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 17:30:00') AND '2013-07-15 17:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T044: quantile window ending at 2013-07-15 18:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 18:00:00') AND '2013-07-15 18:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T045: quantile window ending at 2013-07-15 18:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 18:30:00') AND '2013-07-15 18:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T046: quantile window ending at 2013-07-15 19:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 19:00:00') AND '2013-07-15 19:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T047: quantile window ending at 2013-07-15 19:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 19:30:00') AND '2013-07-15 19:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T048: quantile window ending at 2013-07-15 20:00:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 20:00:00') AND '2013-07-15 20:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T049: quantile window ending at 2013-07-15 20:30:00 +SELECT QUANTILE(0.95, ResolutionWidth) FROM hits WHERE EventTime BETWEEN DATEADD(s, -10, '2013-07-15 20:30:00') AND '2013-07-15 20:30:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; diff --git a/asap-tools/execution-utilities/asap_query_latency/clickhouse_quantile_queries.sql b/asap-tools/execution-utilities/asap_query_latency/clickhouse_quantile_queries.sql new file mode 100644 index 0000000..7c7ced4 --- /dev/null +++ b/asap-tools/execution-utilities/asap_query_latency/clickhouse_quantile_queries.sql @@ -0,0 +1,530 @@ +-- T000: quantile window ending at 2013-07-01 20:00:00 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 19:50:00' AND '2013-07-01 20:00:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T001: quantile window ending at 2013-07-01 20:13:16 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 20:03:16' AND '2013-07-01 20:13:16' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T002: quantile window ending at 2013-07-01 20:26:32 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 20:16:32' AND '2013-07-01 20:26:32' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T003: quantile window ending at 2013-07-01 20:39:48 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 20:29:48' AND '2013-07-01 20:39:48' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T004: quantile window ending at 2013-07-01 20:53:04 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 20:43:04' AND '2013-07-01 20:53:04' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T005: quantile window ending at 2013-07-01 21:06:20 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 20:56:20' AND '2013-07-01 21:06:20' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T006: quantile window ending at 2013-07-01 21:19:36 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 21:09:36' AND '2013-07-01 21:19:36' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T007: quantile window ending at 2013-07-01 21:32:52 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 21:22:52' AND '2013-07-01 21:32:52' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T008: quantile window ending at 2013-07-01 21:46:08 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 21:36:08' AND '2013-07-01 21:46:08' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T009: quantile window ending at 2013-07-01 21:59:24 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 21:49:24' AND '2013-07-01 21:59:24' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T010: quantile window ending at 2013-07-01 22:12:40 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 22:02:40' AND '2013-07-01 22:12:40' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T011: quantile window ending at 2013-07-01 22:25:56 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 22:15:56' AND '2013-07-01 22:25:56' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T012: quantile window ending at 2013-07-01 22:39:12 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 22:29:12' AND '2013-07-01 22:39:12' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T013: quantile window ending at 2013-07-01 22:52:28 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 22:42:28' AND '2013-07-01 22:52:28' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T014: quantile window ending at 2013-07-01 23:05:44 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 22:55:44' AND '2013-07-01 23:05:44' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T015: quantile window ending at 2013-07-01 23:19:00 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 23:09:00' AND '2013-07-01 23:19:00' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T016: quantile window ending at 2013-07-01 23:32:16 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 23:22:16' AND '2013-07-01 23:32:16' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T017: quantile window ending at 2013-07-01 23:45:32 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 23:35:32' AND '2013-07-01 23:45:32' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T018: quantile window ending at 2013-07-01 23:58:48 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-01 23:48:48' AND '2013-07-01 23:58:48' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T019: quantile window ending at 2013-07-02 00:12:04 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 00:02:04' AND '2013-07-02 00:12:04' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T020: quantile window ending at 2013-07-02 00:25:20 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 00:15:20' AND '2013-07-02 00:25:20' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T021: quantile window ending at 2013-07-02 00:38:36 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 00:28:36' AND '2013-07-02 00:38:36' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T022: quantile window ending at 2013-07-02 00:51:52 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 00:41:52' AND '2013-07-02 00:51:52' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T023: quantile window ending at 2013-07-02 01:05:08 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 00:55:08' AND '2013-07-02 01:05:08' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T024: quantile window ending at 2013-07-02 01:18:24 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 01:08:24' AND '2013-07-02 01:18:24' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T025: quantile window ending at 2013-07-02 01:31:40 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 01:21:40' AND '2013-07-02 01:31:40' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T026: quantile window ending at 2013-07-02 01:44:56 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 01:34:56' AND '2013-07-02 01:44:56' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T027: quantile window ending at 2013-07-02 01:58:12 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 01:48:12' AND '2013-07-02 01:58:12' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T028: quantile window ending at 2013-07-02 02:11:28 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 02:01:28' AND '2013-07-02 02:11:28' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T029: quantile window ending at 2013-07-02 02:24:45 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 02:14:45' AND '2013-07-02 02:24:45' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T030: quantile window ending at 2013-07-02 02:38:01 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 02:28:01' AND '2013-07-02 02:38:01' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T031: quantile window ending at 2013-07-02 02:51:17 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 02:41:17' AND '2013-07-02 02:51:17' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T032: quantile window ending at 2013-07-02 03:04:33 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 02:54:33' AND '2013-07-02 03:04:33' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T033: quantile window ending at 2013-07-02 03:17:49 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 03:07:49' AND '2013-07-02 03:17:49' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T034: quantile window ending at 2013-07-02 03:31:05 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 03:21:05' AND '2013-07-02 03:31:05' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T035: quantile window ending at 2013-07-02 03:44:21 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 03:34:21' AND '2013-07-02 03:44:21' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T036: quantile window ending at 2013-07-02 03:57:37 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 03:47:37' AND '2013-07-02 03:57:37' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T037: quantile window ending at 2013-07-02 04:10:53 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 04:00:53' AND '2013-07-02 04:10:53' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T038: quantile window ending at 2013-07-02 04:24:09 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 04:14:09' AND '2013-07-02 04:24:09' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T039: quantile window ending at 2013-07-02 04:37:25 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 04:27:25' AND '2013-07-02 04:37:25' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T040: quantile window ending at 2013-07-02 04:50:41 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 04:40:41' AND '2013-07-02 04:50:41' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T041: quantile window ending at 2013-07-02 05:03:57 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 04:53:57' AND '2013-07-02 05:03:57' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T042: quantile window ending at 2013-07-02 05:17:13 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 05:07:13' AND '2013-07-02 05:17:13' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T043: quantile window ending at 2013-07-02 05:30:29 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 05:20:29' AND '2013-07-02 05:30:29' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T044: quantile window ending at 2013-07-02 05:43:45 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 05:33:45' AND '2013-07-02 05:43:45' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T045: quantile window ending at 2013-07-02 05:57:01 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 05:47:01' AND '2013-07-02 05:57:01' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T046: quantile window ending at 2013-07-02 06:10:17 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 06:00:17' AND '2013-07-02 06:10:17' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T047: quantile window ending at 2013-07-02 06:23:33 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 06:13:33' AND '2013-07-02 06:23:33' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T048: quantile window ending at 2013-07-02 06:36:49 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 06:26:49' AND '2013-07-02 06:36:49' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T049: quantile window ending at 2013-07-02 06:50:05 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 06:40:05' AND '2013-07-02 06:50:05' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T050: quantile window ending at 2013-07-02 07:03:21 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 06:53:21' AND '2013-07-02 07:03:21' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T051: quantile window ending at 2013-07-02 07:16:37 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 07:06:37' AND '2013-07-02 07:16:37' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T052: quantile window ending at 2013-07-02 07:29:53 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 07:19:53' AND '2013-07-02 07:29:53' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T053: quantile window ending at 2013-07-02 07:43:09 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 07:33:09' AND '2013-07-02 07:43:09' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T054: quantile window ending at 2013-07-02 07:56:25 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 07:46:25' AND '2013-07-02 07:56:25' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T055: quantile window ending at 2013-07-02 08:09:41 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 07:59:41' AND '2013-07-02 08:09:41' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T056: quantile window ending at 2013-07-02 08:22:57 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 08:12:57' AND '2013-07-02 08:22:57' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T057: quantile window ending at 2013-07-02 08:36:13 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 08:26:13' AND '2013-07-02 08:36:13' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T058: quantile window ending at 2013-07-02 08:49:30 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 08:39:30' AND '2013-07-02 08:49:30' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T059: quantile window ending at 2013-07-02 09:02:46 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 08:52:46' AND '2013-07-02 09:02:46' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T060: quantile window ending at 2013-07-02 09:16:02 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 09:06:02' AND '2013-07-02 09:16:02' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T061: quantile window ending at 2013-07-02 09:29:18 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 09:19:18' AND '2013-07-02 09:29:18' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T062: quantile window ending at 2013-07-02 09:42:34 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 09:32:34' AND '2013-07-02 09:42:34' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T063: quantile window ending at 2013-07-02 09:55:50 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 09:45:50' AND '2013-07-02 09:55:50' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T064: quantile window ending at 2013-07-02 10:09:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 09:59:06' AND '2013-07-02 10:09:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T065: quantile window ending at 2013-07-02 10:22:22 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 10:12:22' AND '2013-07-02 10:22:22' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T066: quantile window ending at 2013-07-02 10:35:38 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 10:25:38' AND '2013-07-02 10:35:38' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T067: quantile window ending at 2013-07-02 10:48:54 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 10:38:54' AND '2013-07-02 10:48:54' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T068: quantile window ending at 2013-07-02 11:02:10 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 10:52:10' AND '2013-07-02 11:02:10' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T069: quantile window ending at 2013-07-02 11:15:26 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 11:05:26' AND '2013-07-02 11:15:26' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T070: quantile window ending at 2013-07-02 11:28:42 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 11:18:42' AND '2013-07-02 11:28:42' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T071: quantile window ending at 2013-07-02 11:41:58 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 11:31:58' AND '2013-07-02 11:41:58' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T072: quantile window ending at 2013-07-02 11:55:14 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 11:45:14' AND '2013-07-02 11:55:14' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T073: quantile window ending at 2013-07-02 12:08:30 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 11:58:30' AND '2013-07-02 12:08:30' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T074: quantile window ending at 2013-07-02 12:21:46 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 12:11:46' AND '2013-07-02 12:21:46' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T075: quantile window ending at 2013-07-02 12:35:02 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 12:25:02' AND '2013-07-02 12:35:02' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T076: quantile window ending at 2013-07-02 12:48:18 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 12:38:18' AND '2013-07-02 12:48:18' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T077: quantile window ending at 2013-07-02 13:01:34 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 12:51:34' AND '2013-07-02 13:01:34' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T078: quantile window ending at 2013-07-02 13:14:50 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 13:04:50' AND '2013-07-02 13:14:50' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T079: quantile window ending at 2013-07-02 13:28:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 13:18:06' AND '2013-07-02 13:28:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T080: quantile window ending at 2013-07-02 13:41:22 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 13:31:22' AND '2013-07-02 13:41:22' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T081: quantile window ending at 2013-07-02 13:54:38 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 13:44:38' AND '2013-07-02 13:54:38' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T082: quantile window ending at 2013-07-02 14:07:54 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 13:57:54' AND '2013-07-02 14:07:54' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T083: quantile window ending at 2013-07-02 14:21:10 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 14:11:10' AND '2013-07-02 14:21:10' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T084: quantile window ending at 2013-07-02 14:34:26 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 14:24:26' AND '2013-07-02 14:34:26' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T085: quantile window ending at 2013-07-02 14:47:42 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 14:37:42' AND '2013-07-02 14:47:42' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T086: quantile window ending at 2013-07-02 15:00:59 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 14:50:59' AND '2013-07-02 15:00:59' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T087: quantile window ending at 2013-07-02 15:14:15 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 15:04:15' AND '2013-07-02 15:14:15' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T088: quantile window ending at 2013-07-02 15:27:31 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 15:17:31' AND '2013-07-02 15:27:31' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T089: quantile window ending at 2013-07-02 15:40:47 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 15:30:47' AND '2013-07-02 15:40:47' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T090: quantile window ending at 2013-07-02 15:54:03 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 15:44:03' AND '2013-07-02 15:54:03' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T091: quantile window ending at 2013-07-02 16:07:19 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 15:57:19' AND '2013-07-02 16:07:19' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T092: quantile window ending at 2013-07-02 16:20:35 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 16:10:35' AND '2013-07-02 16:20:35' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T093: quantile window ending at 2013-07-02 16:33:51 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 16:23:51' AND '2013-07-02 16:33:51' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T094: quantile window ending at 2013-07-02 16:47:07 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 16:37:07' AND '2013-07-02 16:47:07' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T095: quantile window ending at 2013-07-02 17:00:23 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 16:50:23' AND '2013-07-02 17:00:23' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T096: quantile window ending at 2013-07-02 17:13:39 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 17:03:39' AND '2013-07-02 17:13:39' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T097: quantile window ending at 2013-07-02 17:26:55 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 17:16:55' AND '2013-07-02 17:26:55' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T098: quantile window ending at 2013-07-02 17:40:11 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 17:30:11' AND '2013-07-02 17:40:11' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T099: quantile window ending at 2013-07-02 17:53:27 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 17:43:27' AND '2013-07-02 17:53:27' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T100: quantile window ending at 2013-07-02 18:06:43 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 17:56:43' AND '2013-07-02 18:06:43' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T101: quantile window ending at 2013-07-02 18:19:59 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 18:09:59' AND '2013-07-02 18:19:59' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T102: quantile window ending at 2013-07-02 18:33:15 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 18:23:15' AND '2013-07-02 18:33:15' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T103: quantile window ending at 2013-07-02 18:46:31 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 18:36:31' AND '2013-07-02 18:46:31' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T104: quantile window ending at 2013-07-02 18:59:47 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 18:49:47' AND '2013-07-02 18:59:47' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T105: quantile window ending at 2013-07-02 19:13:03 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 19:03:03' AND '2013-07-02 19:13:03' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T106: quantile window ending at 2013-07-02 19:26:19 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 19:16:19' AND '2013-07-02 19:26:19' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T107: quantile window ending at 2013-07-02 19:39:35 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 19:29:35' AND '2013-07-02 19:39:35' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T108: quantile window ending at 2013-07-02 19:52:51 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 19:42:51' AND '2013-07-02 19:52:51' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T109: quantile window ending at 2013-07-02 20:06:07 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 19:56:07' AND '2013-07-02 20:06:07' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T110: quantile window ending at 2013-07-02 20:19:23 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 20:09:23' AND '2013-07-02 20:19:23' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T111: quantile window ending at 2013-07-02 20:32:39 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 20:22:39' AND '2013-07-02 20:32:39' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T112: quantile window ending at 2013-07-02 20:45:55 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 20:35:55' AND '2013-07-02 20:45:55' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T113: quantile window ending at 2013-07-02 20:59:11 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 20:49:11' AND '2013-07-02 20:59:11' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T114: quantile window ending at 2013-07-02 21:12:27 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:02:27' AND '2013-07-02 21:12:27' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T115: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T116: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T117: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T118: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T119: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T120: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T121: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T122: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T123: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T124: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T125: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T126: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T127: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T128: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T129: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T130: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T131: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T132: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T133: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T134: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T135: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T136: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T137: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T138: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T139: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T140: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T141: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T142: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T143: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T144: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T145: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T146: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T147: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T148: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T149: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T150: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T151: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T152: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T153: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T154: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T155: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T156: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T157: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T158: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T159: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T160: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T161: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T162: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T163: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T164: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T165: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T166: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T167: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T168: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T169: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T170: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T171: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T172: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T173: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T174: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T175: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T176: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T177: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T178: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T179: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T180: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T181: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T182: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T183: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T184: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T185: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T186: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T187: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T188: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T189: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T190: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T191: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T192: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T193: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T194: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T195: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T196: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T197: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T198: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T199: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T200: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T201: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T202: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T203: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T204: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T205: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T206: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T207: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T208: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T209: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T210: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T211: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T212: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T213: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T214: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T215: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T216: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T217: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T218: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T219: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T220: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T221: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T222: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T223: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T224: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T225: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T226: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T227: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T228: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T229: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T230: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T231: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T232: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T233: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T234: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T235: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T236: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T237: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T238: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T239: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T240: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T241: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T242: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T243: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T244: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T245: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T246: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T247: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T248: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T249: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T250: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T251: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T252: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T253: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T254: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T255: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T256: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T257: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T258: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T259: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T260: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T261: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T262: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T263: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; +-- T264: quantile window ending at 2013-07-02 21:19:06 +SELECT quantile(0.95)(ResolutionWidth) FROM hits WHERE EventTime BETWEEN '2013-07-02 21:09:06' AND '2013-07-02 21:19:06' GROUP BY RegionID, OS, UserAgent, TraficSourceID; diff --git a/asap-tools/execution-utilities/asap_query_latency/inference_config.yaml b/asap-tools/execution-utilities/asap_query_latency/inference_config.yaml new file mode 100644 index 0000000..4a4c128 --- /dev/null +++ b/asap-tools/execution-utilities/asap_query_latency/inference_config.yaml @@ -0,0 +1,80 @@ +# ASAP Inference Config for ClickBench Hits Dataset +tables: + - name: hits + time_column: EventTime + metadata_columns: [RegionID, OS, UserAgent, TraficSourceID] + value_columns: [ResolutionWidth] + +cleanup_policy: + name: read_based + +# Only quantile queries enabled (T5, T6) +queries: + # # Spatial queries (1s window, partial labels) + # - aggregations: + # - aggregation_id: 1 + # read_count_threshold: 1 + # query: | + # SELECT SUM(ResolutionWidth) FROM hits + # WHERE EventTime BETWEEN DATEADD(s, -1, NOW()) AND NOW() + # GROUP BY RegionID + + # - aggregations: + # - aggregation_id: 2 + # read_count_threshold: 1 + # query: | + # SELECT AVG(ResolutionWidth) FROM hits + # WHERE EventTime BETWEEN DATEADD(s, -1, NOW()) AND NOW() + # GROUP BY RegionID, OS + + # - aggregations: + # - aggregation_id: 3 + # read_count_threshold: 1 + # query: | + # SELECT MAX(ResolutionWidth) FROM hits + # WHERE EventTime BETWEEN DATEADD(s, -1, NOW()) AND NOW() + # GROUP BY RegionID, OS, UserAgent + + # # Temporal queries (10s window, all labels) - SUM + # - aggregations: + # - aggregation_id: 10 + # read_count_threshold: 1 + # query: | + # SELECT SUM(ResolutionWidth) FROM hits + # WHERE EventTime BETWEEN DATEADD(s, -10, NOW()) AND NOW() + # GROUP BY RegionID, OS, UserAgent, TraficSourceID + + # # Temporal queries (10s window, all labels) - AVG + # - aggregations: + # - aggregation_id: 11 + # read_count_threshold: 1 + # query: | + # SELECT AVG(ResolutionWidth) FROM hits + # WHERE EventTime BETWEEN DATEADD(s, -10, NOW()) AND NOW() + # GROUP BY RegionID, OS, UserAgent, TraficSourceID + + # Temporal queries (10s window, all labels) - QUANTILE + - aggregations: + - aggregation_id: 12 + read_count_threshold: 999999 + query: | + SELECT QUANTILE(0.95, ResolutionWidth) FROM hits + WHERE EventTime BETWEEN DATEADD(s, -10, NOW()) AND NOW() + GROUP BY RegionID, OS, UserAgent, TraficSourceID + + # # SpatioTemporal queries (10s window, partial labels) + # - aggregations: + # - aggregation_id: 20 + # read_count_threshold: 1 + # query: | + # SELECT SUM(ResolutionWidth) FROM hits + # WHERE EventTime BETWEEN DATEADD(s, -10, NOW()) AND NOW() + # GROUP BY RegionID + + # - aggregations: + # - aggregation_id: 21 + # read_count_threshold: 1 + # query: | + # SELECT AVG(ResolutionWidth) FROM hits + # WHERE EventTime BETWEEN DATEADD(s, -10, NOW()) AND NOW() + # GROUP BY RegionID, OS diff --git a/asap-tools/execution-utilities/asap_query_latency/plot_latency.py b/asap-tools/execution-utilities/asap_query_latency/plot_latency.py new file mode 100644 index 0000000..9abbcf3 --- /dev/null +++ b/asap-tools/execution-utilities/asap_query_latency/plot_latency.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +"""Plot ASAP vs baseline latency comparison.""" + +import csv +import matplotlib.pyplot as plt +import numpy as np +from pathlib import Path + +HERE = Path(__file__).parent + + +def load(path): + rows = {} + with open(path) as f: + for row in csv.DictReader(f): + if not row["error"]: + rows[row["query_id"]] = float(row["latency_ms"]) + return rows + + +asap = load(HERE / "asap_results.csv") +base = load(HERE / "baseline_results.csv") + +qids = sorted(set(asap) & set(base)) +x = np.arange(len(qids)) +a_vals = [asap[q] for q in qids] +b_vals = [base[q] for q in qids] +speedup = [b / a for a, b in zip(a_vals, b_vals)] + +fig, (ax1, ax2) = plt.subplots( + 2, 1, figsize=(14, 7), gridspec_kw={"height_ratios": [3, 1]} +) + +# --- Top: per-query latency --- +w = 0.4 +ax1.bar(x - w / 2, b_vals, w, label="ClickHouse baseline", color="#f4a460") +ax1.bar(x + w / 2, a_vals, w, label="ASAP (KLL sketch)", color="#4682b4") +ax1.set_xticks(x) +ax1.set_xticklabels(qids, rotation=90, fontsize=7) +ax1.set_ylabel("Latency (ms)") +ax1.set_title( + "Query latency: ASAP vs ClickHouse baseline " + f"(p50: {np.median(a_vals):.1f}ms vs {np.median(b_vals):.1f}ms)" +) +ax1.legend() +ax1.set_xlim(-0.6, len(qids) - 0.4) + +# --- Bottom: speedup --- +ax2.bar(x, speedup, color="#2e8b57", width=0.7) +ax2.axhline( + np.mean(speedup), + color="red", + linewidth=1, + linestyle="--", + label=f"mean {np.mean(speedup):.1f}×", +) +ax2.set_xticks(x) +ax2.set_xticklabels(qids, rotation=90, fontsize=7) +ax2.set_ylabel("Speedup (×)") +ax2.legend(fontsize=8) +ax2.set_xlim(-0.6, len(qids) - 0.4) + +plt.tight_layout() +out = HERE / "latency_comparison.png" +plt.savefig(out, dpi=150) +print(f"Saved {out}") diff --git a/asap-tools/execution-utilities/asap_query_latency/run_benchmark.py b/asap-tools/execution-utilities/asap_query_latency/run_benchmark.py new file mode 100755 index 0000000..5ea950f --- /dev/null +++ b/asap-tools/execution-utilities/asap_query_latency/run_benchmark.py @@ -0,0 +1,411 @@ +#!/usr/bin/env python3 +""" +Benchmark ASAP queries against ClickBench hits dataset. +Outputs CSV with query ID, latency, and results. +""" + +import argparse +import csv +import re +import time +import urllib.parse +from pathlib import Path +from typing import List, Tuple, Optional +import subprocess +import requests + + +def extract_queries_from_sql(sql_file: Path) -> List[Tuple[str, str]]: + """Extract query ID and SQL from asap_test_queries.sql""" + queries = [] + with open(sql_file, "r") as f: + content = f.read() + + # Pattern to match: -- S1: description\nSELECT ... ; or -- T5_W0: description\nSELECT ... ; + pattern = r"-- ([A-Za-z0-9_]+):[^\n]*\n(SELECT[^;]+;)" + matches = re.findall(pattern, content, re.DOTALL | re.IGNORECASE) + + for query_id, sql in matches: + # Clean up SQL + sql = sql.strip() + queries.append((query_id, sql)) + + return queries + + +def load_clickbench_data(clickhouse_url: str): + """Load ClickBench hits.json.gz data into ClickHouse""" + print("Setting up ClickHouse tables...") + + # Create hits table + create_table_sql = """ + CREATE TABLE IF NOT EXISTS hits ( + EventTime DateTime, + EventDate Date, + WatchID UInt64, + JavaEnable UInt8, + Title String, + GoodEvent UInt16, + CounterID UInt32, + ClientIP Int32, + RegionID UInt32, + UserID String, + CounterClass Int8, + OS UInt8, + UserAgent UInt8, + URL String, + Referer String, + IsRefresh UInt8, + RefererCategoryID UInt16, + RefererRegionID UInt32, + URLCategoryID UInt16, + URLRegionID UInt32, + ResolutionWidth UInt16, + ResolutionHeight UInt16, + ResolutionDepth UInt8, + FlashMajor UInt8, + FlashMinor UInt8, + FlashMinor2 String, + NetMajor UInt8, + NetMinor UInt8, + UserAgentMajor UInt16, + UserAgentMinor String, + CookieEnable UInt8, + JavascriptEnable UInt8, + IsMobile UInt8, + MobilePhone UInt8, + MobilePhoneModel String, + Params String, + IPNetworkID UInt32, + TraficSourceID Int8, + SearchEngineID UInt16, + SearchPhrase String, + AdvEngineID UInt8, + IsArtifical UInt8, + WindowClientWidth UInt16, + WindowClientHeight UInt16, + ClientTimeZone Int16, + ClientEventTime DateTime, + SilverlightVersion1 UInt8, + SilverlightVersion2 UInt8, + SilverlightVersion3 UInt32, + SilverlightVersion4 UInt16, + PageCharset String, + CodeVersion UInt32, + IsLink UInt8, + IsDownload UInt8, + IsNotBounce UInt8, + FUniqID String, + OriginalURL String, + HID UInt32, + IsOldCounter UInt8, + IsEvent UInt8, + IsParameter UInt8, + DontCountHits UInt8, + WithHash UInt8, + HitColor String, + LocalEventTime DateTime, + Age UInt8, + Sex UInt8, + Income UInt8, + Interests UInt16, + Robotness UInt8, + RemoteIP Int32, + WindowName Int32, + OpenerName Int32, + HistoryLength Int16, + BrowserLanguage String, + BrowserCountry String, + SocialNetwork String, + SocialAction String, + HTTPError UInt16, + SendTiming UInt32, + DNSTiming UInt32, + ConnectTiming UInt32, + ResponseStartTiming UInt32, + ResponseEndTiming UInt32, + FetchTiming UInt32, + SocialSourceNetworkID UInt8, + SocialSourcePage String, + ParamPrice String, + ParamOrderID String, + ParamCurrency String, + ParamCurrencyID UInt16, + OpenstatServiceName String, + OpenstatCampaignID String, + OpenstatAdID String, + OpenstatSourceID String, + UTMSource String, + UTMMedium String, + UTMCampaign String, + UTMContent String, + UTMTerm String, + FromTag String, + HasGCLID UInt8, + RefererHash Int64, + URLHash Int64, + CLID UInt32 + ) ENGINE = MergeTree() + ORDER BY (RegionID, OS, UserAgent, TraficSourceID, EventTime); + """ + + try: + response = requests.post(clickhouse_url, data=create_table_sql) + response.raise_for_status() + print("✓ Created hits table") + except Exception as e: + print(f"Error creating table: {e}") + return False + + # Check if data already loaded + count_sql = "SELECT count(*) FROM hits" + response = requests.post(clickhouse_url, data=count_sql) + count = int(response.text.strip()) + + if count > 0: + print(f"✓ Data already loaded ({count:,} rows)") + return True + + # Load data from hits.json.gz + data_file = Path( + "/users/STWang/asap-internal/ExecutionUtilities/clickhouse-benchmark-pipeline/clickbench_importer/data/hits.json.gz" + ) + if not data_file.exists(): + print(f"✗ Data file not found: {data_file}") + return False + + print(f"Loading data from {data_file}...") + print("This may take a few minutes...") + + # Use clickhouse-client to load data + cmd = f"zcat {data_file} | clickhouse-client --query='INSERT INTO hits FORMAT JSONEachRow'" + result = subprocess.run(cmd, shell=True, capture_output=True, text=True) + + if result.returncode != 0: + print(f"✗ Error loading data: {result.stderr}") + return False + + # Verify + response = requests.post(clickhouse_url, data=count_sql) + count = int(response.text.strip()) + print(f"✓ Loaded {count:,} rows") + + return True + + +def run_query( + query: str, endpoint_url: str, timeout: int = 30, debug: bool = False +) -> Tuple[float, Optional[str], Optional[str]]: + """ + Run a query and return (latency_ms, result, error). + debug=True prints per-request HTTP status. For detailed latency decomposition, + run QueryEngineRust with --log-level DEBUG. + """ + encoded_query = urllib.parse.quote(query) + separator = "&" if "?" in endpoint_url else "?" + url = f"{endpoint_url}{separator}query={encoded_query}" + + try: + start_time = time.time() + response = requests.get(url, timeout=timeout) + latency_ms = (time.time() - start_time) * 1000 + + if debug: + status = response.status_code + # Without --forward-unsupported-queries: 200 = ASAP served, else error + source = "ASAP sketch" if status == 200 else f"error (HTTP {status})" + print(f" [{source}] {latency_ms:.2f}ms status={status}") + + if response.status_code == 200: + return latency_ms, response.text.strip(), None + else: + return latency_ms, None, f"HTTP {response.status_code}: {response.text}" + + except requests.Timeout: + return timeout * 1000, None, "Timeout" + except Exception as e: + return 0, None, str(e) + + +def run_benchmark( + sql_file: Path, + endpoint_url: str, + output_csv: Path, + mode: str = "baseline", + query_filter: Optional[List[str]] = None, + debug: bool = False, +): + """Run all queries and save results to CSV""" + + print(f"\nRunning benchmark in {mode} mode...") + print(f"Endpoint: {endpoint_url}") + print(f"Output: {output_csv}") + if debug: + print( + "Debug mode: per-query HTTP status shown. For latency decomposition, run QueryEngineRust with --log-level DEBUG." + ) + + # Extract queries + queries = extract_queries_from_sql(sql_file) + if query_filter: + queries = [(qid, sql) for qid, sql in queries if qid in query_filter] + print(f"Found {len(queries)} queries") + + # Prepare CSV + with open(output_csv, "w", newline="") as csvfile: + writer = csv.writer(csvfile) + writer.writerow( + [ + "query_id", + "query_pattern", + "latency_ms", + "result_rows", + "result_full", + "error", + "mode", + ] + ) + + latencies_ok: List[float] = [] + + for query_id, sql in queries: + print(f"Running {query_id}...", end=" " if not debug else "\n") + + # Determine query pattern + if query_id.startswith("S"): + pattern = "Spatial" + elif query_id.startswith("T"): + pattern = "Temporal" + elif query_id.startswith("ST"): + pattern = "SpatioTemporal" + elif query_id.startswith("N"): + pattern = "Nested" + elif query_id.startswith("D"): + pattern = "Dated" + elif query_id.startswith("L"): + pattern = "LongRange" + else: + pattern = "Unknown" + + # Run query + latency_ms, result, error = run_query(sql, endpoint_url, debug=debug) + + if error: + print(f"✗ {error}") + writer.writerow([query_id, pattern, latency_ms, 0, "", error, mode]) + else: + # Count result rows + result_lines = result.strip().split("\n") if result else [] + num_rows = len(result_lines) + + # Full result (replace newlines with | for CSV compatibility) + preview = result.replace("\n", " | ") if result else "" + + latencies_ok.append(latency_ms) + print(f"✓ {latency_ms:.2f}ms ({num_rows} rows)") + writer.writerow( + [ + query_id, + pattern, + f"{latency_ms:.2f}", + num_rows, + preview, + "", + mode, + ] + ) + + # Small delay between queries + time.sleep(0.1) + + print(f"\n✓ Results saved to {output_csv}") + + if latencies_ok: + latencies_ok.sort() + n = len(latencies_ok) + avg = sum(latencies_ok) / n + p50 = latencies_ok[int(n * 0.50)] + p95 = latencies_ok[int(n * 0.95)] + print(f"\nLatency summary ({n} successful queries):") + print( + f" min={latencies_ok[0]:.2f}ms avg={avg:.2f}ms p50={p50:.2f}ms p95={p95:.2f}ms max={latencies_ok[-1]:.2f}ms" + ) + + +def main(): + parser = argparse.ArgumentParser( + description="Benchmark ASAP queries on ClickBench data" + ) + parser.add_argument( + "--mode", + choices=["baseline", "asap"], + default="asap", + help="ASAP mode (default) or Baseline (ClickHouse only)", + ) + parser.add_argument( + "--load-data", action="store_true", help="Load ClickBench data into ClickHouse" + ) + parser.add_argument( + "--clickhouse-url", + default="http://localhost:8123/?session_timezone=UTC", + help="ClickHouse server URL", + ) + parser.add_argument( + "--asap-url", + default="http://localhost:8088/clickhouse/query", + help="ASAP QueryEngine URL", + ) + parser.add_argument( + "--output", + default="asap_results.csv", + help="Output CSV file (default: asap_results.csv)", + ) + parser.add_argument( + "--sql-file", + default=None, + help="SQL file to use (default: asap_test_queries.sql)", + ) + parser.add_argument( + "--filter", + default=None, + help="Comma-separated query IDs to run (e.g. T5,T6)", + ) + parser.add_argument( + "--debug", + action="store_true", + help="Show per-query HTTP status and latency summary. For full latency decomposition, run QueryEngineRust with --log-level DEBUG.", + ) + + args = parser.parse_args() + + sql_file = ( + Path(args.sql_file) + if args.sql_file + else Path(__file__).parent / "asap_test_queries.sql" + ) + + # Load data if requested + if args.load_data: + if not load_clickbench_data(args.clickhouse_url): + print("Failed to load data") + return 1 + + # Determine endpoint + if args.mode == "baseline": + endpoint = args.clickhouse_url + else: + endpoint = args.asap_url + + # Parse filter + query_filter = [q.strip() for q in args.filter.split(",")] if args.filter else None + + # Run benchmark + run_benchmark( + sql_file, endpoint, Path(args.output), args.mode, query_filter, args.debug + ) + + return 0 + + +if __name__ == "__main__": + exit(main()) diff --git a/asap-tools/execution-utilities/asap_query_latency/streaming_config.yaml b/asap-tools/execution-utilities/asap_query_latency/streaming_config.yaml new file mode 100644 index 0000000..633d8b9 --- /dev/null +++ b/asap-tools/execution-utilities/asap_query_latency/streaming_config.yaml @@ -0,0 +1,136 @@ +# ASAP Streaming Config for ClickBench Hits Dataset +# Defines sketch aggregations for Arroyo to compute + +tables: + - name: hits + time_column: EventTime + metadata_columns: [RegionID, OS, UserAgent, TraficSourceID] + value_columns: [ResolutionWidth] + +# Only quantile aggregation enabled (for T5, T6) +aggregations: + # # Spatial queries (1s window, partial labels) + # - aggregationId: 1 + # aggregationType: Sum + # aggregationSubType: '' + # labels: + # grouping: [RegionID] + # rollup: [OS, UserAgent, TraficSourceID] + # aggregated: [] + # table_name: hits + # value_column: ResolutionWidth + # parameters: {} + # tumblingWindowSize: 1 + # windowSize: 1 + # windowType: tumbling + # spatialFilter: '' + + # - aggregationId: 2 + # aggregationType: Avg + # aggregationSubType: '' + # labels: + # grouping: [RegionID, OS] + # rollup: [UserAgent, TraficSourceID] + # aggregated: [] + # table_name: hits + # value_column: ResolutionWidth + # parameters: {} + # tumblingWindowSize: 1 + # windowSize: 1 + # windowType: tumbling + # spatialFilter: '' + + # - aggregationId: 3 + # aggregationType: Max + # aggregationSubType: '' + # labels: + # grouping: [RegionID, OS, UserAgent] + # rollup: [TraficSourceID] + # aggregated: [] + # table_name: hits + # value_column: ResolutionWidth + # parameters: {} + # tumblingWindowSize: 1 + # windowSize: 1 + # windowType: tumbling + # spatialFilter: '' + + # # Temporal queries (10s window, all labels) - SUM + # - aggregationId: 10 + # aggregationType: Sum + # aggregationSubType: '' + # labels: + # grouping: [RegionID, OS, UserAgent, TraficSourceID] + # rollup: [] + # aggregated: [] + # table_name: hits + # value_column: ResolutionWidth + # parameters: {} + # tumblingWindowSize: 1 + # windowSize: 10 + # windowType: tumbling + # spatialFilter: '' + + # # Temporal queries (10s window, all labels) - AVG + # - aggregationId: 11 + # aggregationType: Avg + # aggregationSubType: '' + # labels: + # grouping: [RegionID, OS, UserAgent, TraficSourceID] + # rollup: [] + # aggregated: [] + # table_name: hits + # value_column: ResolutionWidth + # parameters: {} + # tumblingWindowSize: 1 + # windowSize: 10 + # windowType: tumbling + # spatialFilter: '' + + # Temporal queries (10s window, all labels) - QUANTILE (DatasketchesKLL) + - aggregationId: 12 + aggregationType: DatasketchesKLL + aggregationSubType: '' + labels: + grouping: [RegionID, OS, UserAgent, TraficSourceID] + rollup: [] + aggregated: [] + table_name: hits + value_column: ResolutionWidth + parameters: + K: 200 + tumblingWindowSize: 10 + windowSize: 10 + windowType: tumbling + spatialFilter: '' + + # # SpatioTemporal queries (10s window, partial labels) + # - aggregationId: 20 + # aggregationType: Sum + # aggregationSubType: '' + # labels: + # grouping: [RegionID] + # rollup: [OS, UserAgent, TraficSourceID] + # aggregated: [] + # table_name: hits + # value_column: ResolutionWidth + # parameters: {} + # tumblingWindowSize: 1 + # windowSize: 10 + # windowType: tumbling + # spatialFilter: '' + + # - aggregationId: 21 + # aggregationType: Avg + # aggregationSubType: '' + # labels: + # grouping: [RegionID, OS] + # rollup: [UserAgent, TraficSourceID] + # aggregated: [] + # table_name: hits + # value_column: ResolutionWidth + # parameters: {} + # tumblingWindowSize: 1 + # windowSize: 10 + # windowType: tumbling + # spatialFilter: '' diff --git a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/README.md b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/README.md index bba0a72..93c2262 100644 --- a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/README.md +++ b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/README.md @@ -8,27 +8,27 @@ Install and run Kafka and ClickHouse natively (no Docker): ```bash # Install Kafka (one-time) -cd /path/to/asap-tools/installation/kafka -./install.sh /path/to/asap-tools/installation/kafka +cd /path/to/Utilities/installation/kafka +./install.sh /path/to/Utilities/installation/kafka # Install ClickHouse (one-time) -cd /path/to/asap-tools/installation/clickhouse -./install.sh /path/to/asap-tools/installation/clickhouse +cd /path/to/Utilities/installation/clickhouse +./install.sh /path/to/Utilities/installation/clickhouse ``` ## Usage ```bash # 1. Start Kafka (in a terminal) -cd /path/to/asap-tools/installation/kafka +cd /path/to/Utilities/installation/kafka ./run.sh kafka/ # 2. Create Kafka topic kafka/bin/kafka-topics.sh --create --topic hits --bootstrap-server localhost:9092 # 3. Start ClickHouse (in another terminal) -cd /path/to/asap-tools/installation/clickhouse -./run.sh /path/to/asap-tools/installation/clickhouse +cd /path/to/Utilities/installation/clickhouse +./run.sh /path/to/Utilities/installation/clickhouse # 4. Initialize ClickHouse tables ./scripts/init_clickhouse.sh @@ -61,7 +61,7 @@ Edit `config.env` to change defaults. Environment variables override config valu Follow instructions to install Elasticsearch: ```bash -cd /path/to/asap-tools/installation/elastic +cd /path/to/Utilities/installation/elastic ``` ## Configuration @@ -79,4 +79,4 @@ Edit `config.env` to update the `ES_API_KEY` field after installing Elasticsearc # 3. Run benchmark ./scripts/run_benchmark.sh h2o_elastic -``` \ No newline at end of file +``` diff --git a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/clickhouse/clickbench_init.sql b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/clickhouse/clickbench_init.sql index cc06844..bd6c0d1 100644 --- a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/clickhouse/clickbench_init.sql +++ b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/clickhouse/clickbench_init.sql @@ -231,7 +231,8 @@ SETTINGS kafka_group_name = 'clickhouse_hits_consumer', kafka_format = 'JSONEachRow', kafka_num_consumers = 1, - kafka_max_block_size = 65536; + kafka_max_block_size = 65536, + date_time_input_format = 'best_effort'; -- Create materialized view to move data from Kafka to MergeTree CREATE MATERIALIZED VIEW IF NOT EXISTS hits_mv TO hits AS @@ -341,4 +342,4 @@ SELECT RefererHash, URLHash, CLID -FROM hits_kafka; \ No newline at end of file +FROM hits_kafka; diff --git a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/config.env b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/config.env index 83f5ff9..1b80243 100644 --- a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/config.env +++ b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/config.env @@ -6,7 +6,7 @@ PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Kafka KAFKA_BROKER=localhost:9092 # Native Kafka KAFKA_TOPIC=hits -KAFKA_HOME="${PROJECT_DIR}/../../installation/kafka/kafka" +KAFKA_HOME="${PROJECT_DIR}/../../Utilities/installation/kafka/kafka" # ClickHouse CLICKHOUSE_HOST=localhost @@ -37,4 +37,4 @@ ES_HOST=localhost ES_PORT=9200 ES_INDEX_NAME=h2o_benchmark ES_BULK_SIZE=10000 -ES_API_KEY=your-api-key \ No newline at end of file +ES_API_KEY=your-api-key diff --git a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/data_exporter/src/main.rs b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/data_exporter/src/main.rs index 58c63f7..19635d8 100644 --- a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/data_exporter/src/main.rs +++ b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/data_exporter/src/main.rs @@ -509,6 +509,10 @@ struct Args { #[arg(long, env = "CLICKBENCH_FILE", help = "Path to hits.json or hits.json.gz (clickbench mode)")] input_file: Option, + #[arg(long, env = "USE_EVENT_TIME_TIMESTAMP", default_value = "false", + help = "Set Kafka message timestamp to EventTime value (enables event-time windowing in Arroyo)")] + use_event_time_timestamp: bool, + #[arg(long, env = "INPUT_FILE", help = "Path to input file (h2o/general usage)")] general_input_file: Option, @@ -624,79 +628,101 @@ async fn run_clickbench_mode(args: &Args, producer: &FutureProducer) -> Result<( Box::new(BufReader::new(file)) }; - let mut total_sent: u64 = 0; let total_limit = args.total_records.unwrap_or(0); - let mut batch: Vec<(String, String)> = Vec::with_capacity(args.batch_size); // (key, payload) - - // ClickBench dataset has ~100M rows let total_rows = if total_limit > 0 { total_limit } else { 99_997_497 }; + + // Phase 1: Read and transform all records into memory + println!("Phase 1: Reading and transforming records..."); let pb = ProgressBar::new(total_rows); pb.set_style(ProgressStyle::default_bar() .template("{spinner:.green} [{elapsed_precise}] [{bar:40.cyan/blue}] {pos}/{len} ({percent}%) {per_sec} ETA: {eta}")? .progress_chars("#>-")); + let mut records: Vec<(i64, String)> = Vec::new(); // (kafka_ts_ms, payload) + let mut read_count: u64 = 0; + for line_result in reader.lines() { let line = match line_result { Ok(l) => l, - Err(e) => { - eprintln!("Warning: Error reading line: {}", e); - continue; - } + Err(e) => { eprintln!("Warning: Error reading line: {}", e); continue; } }; - let line = line.trim(); - if line.is_empty() { - continue; - } + if line.is_empty() { continue; } - let key = (total_sent + batch.len() as u64).to_string(); - batch.push((key, line.to_string())); + // Parse and transform the JSON line to match Arroyo's schema + let mut record: serde_json::Value = match serde_json::from_str(&line) { + Ok(v) => v, + Err(e) => { eprintln!("Warning: Failed to parse JSON line: {}", e); continue; } + }; - if batch.len() >= args.batch_size { - let futures: Vec<_> = batch - .iter() - .map(|(key, payload)| { - producer.send( - FutureRecord::to(&args.kafka_topic.as_ref().unwrap()) - .payload(payload) - .key(key), - Duration::from_secs(5), - ) - }) - .collect(); - - let results = join_all(futures).await; - for result in results { - if let Err((err, _)) = result { - eprintln!("Failed to send message to Kafka: {}", err); + // Fix EventTime: "2013-07-14 20:38:47" -> "2013-07-14T20:38:47Z" (RFC3339) + // Capture as Unix ms for Kafka message timestamp (used for event-time windowing in Arroyo) + let mut kafka_ts_ms: i64 = 0; + if let Some(event_time) = record.get_mut("EventTime") { + if let Some(s) = event_time.as_str() { + let fixed = s.replacen(' ', "T", 1) + "Z"; + if let Ok(dt) = chrono::DateTime::parse_from_rfc3339(&fixed) { + kafka_ts_ms = dt.timestamp_millis(); } + *event_time = serde_json::Value::String(fixed); } + } - total_sent += batch.len() as u64; - pb.set_position(total_sent); - batch.clear(); - - if total_limit > 0 && total_sent >= total_limit { - break; + // Stringify integer metadata columns to match Arroyo schema (String types) + for field in &["OS", "RegionID", "UserAgent", "TraficSourceID"] { + if let Some(val) = record.get_mut(*field) { + if val.is_number() { + *val = serde_json::Value::String(val.to_string()); + } } + } - if args.frequency > 0 { - sleep(Duration::from_secs(args.frequency)).await; - } + records.push((kafka_ts_ms, serde_json::to_string(&record)?)); + read_count += 1; + pb.set_position(read_count); + + if total_limit > 0 && read_count >= total_limit { + break; } } + pb.finish_with_message(format!("Read {} records", read_count)); + + // Phase 2: Sort by EventTime so Kafka message timestamps are monotonically increasing. + // This is required for Arroyo's event-time watermark to advance correctly. + // Without sorting, out-of-order timestamps cause the watermark to race ahead, + // treating most records as late data and dropping them. + if args.use_event_time_timestamp { + println!("Phase 2: Sorting {} records by EventTime for event-time windowing...", records.len()); + records.sort_unstable_by_key(|(ts, _)| *ts); + println!("Sort complete."); + } - // Send remaining records - if !batch.is_empty() && (total_limit == 0 || total_sent < total_limit) { - let futures: Vec<_> = batch - .iter() - .map(|(key, payload)| { - producer.send( - FutureRecord::to(&args.kafka_topic.as_ref().unwrap()) - .payload(payload) - .key(key), - Duration::from_secs(5), - ) + // Phase 3: Send to Kafka in batches + println!("Phase 3: Sending to Kafka..."); + let pb2 = ProgressBar::new(records.len() as u64); + pb2.set_style(ProgressStyle::default_bar() + .template("{spinner:.green} [{elapsed_precise}] [{bar:40.cyan/blue}] {pos}/{len} ({percent}%) {per_sec} ETA: {eta}")? + .progress_chars("#>-")); + + let mut total_sent: u64 = 0; + + for chunk in records.chunks(args.batch_size) { + // Build batch with owned keys to satisfy FutureRecord lifetime requirements + let batch: Vec<(String, &str, i64)> = chunk.iter().enumerate() + .map(|(i, (ts_ms, payload))| ((total_sent + i as u64).to_string(), payload.as_str(), *ts_ms)) + .collect(); + + let futures: Vec<_> = batch.iter() + .map(|(key, payload, ts_ms)| { + let record = FutureRecord::to(args.kafka_topic.as_deref().unwrap()) + .payload(*payload) + .key(key.as_str()); + let record = if args.use_event_time_timestamp && *ts_ms > 0 { + record.timestamp(*ts_ms) + } else { + record + }; + producer.send(record, Duration::from_secs(5)) }) .collect(); @@ -706,11 +732,16 @@ async fn run_clickbench_mode(args: &Args, producer: &FutureProducer) -> Result<( eprintln!("Failed to send message to Kafka: {}", err); } } - total_sent += batch.len() as u64; - pb.set_position(total_sent); + + total_sent += chunk.len() as u64; + pb2.set_position(total_sent); + + if args.frequency > 0 { + sleep(Duration::from_secs(args.frequency)).await; + } } - pb.finish_with_message(format!("Done! Sent {} records", total_sent)); + pb2.finish_with_message(format!("Done! Sent {} records", total_sent)); Ok(()) } diff --git a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/scripts/generate_data.sh b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/scripts/generate_data.sh index 6ded961..7c519da 100755 --- a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/scripts/generate_data.sh +++ b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/scripts/generate_data.sh @@ -21,7 +21,7 @@ IMPORTER_DIR="${PROJECT_DIR}/benchmark_importer" DATA_DIR="${IMPORTER_DIR}/data" # Hardcoded Kafka Path -KAFKA_HOME="${PROJECT_DIR}/../../installation/kafka/kafka" +KAFKA_HOME="${PROJECT_DIR}/../../Utilities/installation/kafka/kafka" KAFKA_BIN="${KAFKA_HOME}/bin" # Check Mode @@ -47,7 +47,7 @@ case "${DATA_MODE}" in # Synthetic Data Generation # Note: We don't strictly need to create the topic here as the producer will auto-create it, # but if you wanted to enforce partitions, you would use ${KAFKA_BIN}/kafka-topics.sh here. - + EXTRA_ARGS=() if [ -n "${TOTAL_RECORDS}" ] && [ "${TOTAL_RECORDS}" -gt 0 ]; then EXTRA_ARGS+=(--total-records "${TOTAL_RECORDS}") @@ -63,33 +63,44 @@ case "${DATA_MODE}" in clickbench) # Real ClickBench Data echo "Ensuring ClickBench data exists..." - + # Call the Python downloader python3 "${IMPORTER_DIR}/download_data.py" \ --output-dir "${DATA_DIR}" - FILE_NAME="hits.json" + FILE_NAME="hits.json" # Check for .gz if .json doesn't exist if [ ! -f "${DATA_DIR}/${FILE_NAME}" ] && [ -f "${DATA_DIR}/hits.json.gz" ]; then FILE_NAME="hits.json.gz" fi + # Build args for data_exporter in clickbench mode + EXTRA_ARGS=() + if [ -n "${TOTAL_RECORDS}" ] && [ "${TOTAL_RECORDS}" -gt 0 ]; then + EXTRA_ARGS+=(--total-records "${TOTAL_RECORDS}") + fi + + # Enable event-time Kafka timestamps by default in clickbench mode (required for Arroyo windowing) + USE_EVENT_TIME_TIMESTAMP="${USE_EVENT_TIME_TIMESTAMP:-true}" + [ "${USE_EVENT_TIME_TIMESTAMP}" = "true" ] && EXTRA_ARGS+=(--use-event-time-timestamp) + echo "Ingesting ${FILE_NAME} to Kafka..." ./data_exporter/target/release/data_exporter \ --mode clickbench \ --clickbench-file "${DATA_DIR}/${FILE_NAME}" \ --kafka-broker "${KAFKA_BROKER}" \ - --kafka-topic "${KAFKA_TOPIC}" + --kafka-topic "${KAFKA_TOPIC}" \ + "${EXTRA_ARGS[@]}" ;; h2o) # H2O Benchmark Data H2O_TOPIC=${H2O_KAFKA_TOPIC:-h2o_groupby} H2O_FILE="G1_1e7_1e2_0_0.csv" - + # 1. Ensure Topic Exists using hardcoded path echo "Ensuring topic '${H2O_TOPIC}' exists..." - + if [ -x "${KAFKA_BIN}/kafka-topics.sh" ]; then "${KAFKA_BIN}/kafka-topics.sh" --create --if-not-exists \ --topic "${H2O_TOPIC}" \ @@ -101,7 +112,7 @@ case "${DATA_MODE}" in # 2. Download Data echo "Ensuring H2O data exists..." - + # Check and install gdown if missing (required for H2O download) if ! python3 -c "import gdown" 2>/dev/null; then echo "Installing python dependency: gdown..." @@ -124,4 +135,4 @@ case "${DATA_MODE}" in echo "Error: Unknown DATA_MODE '${DATA_MODE}'" exit 1 ;; -esac \ No newline at end of file +esac diff --git a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/scripts/init_clickhouse.sh b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/scripts/init_clickhouse.sh index 1d34355..e1d54bd 100755 --- a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/scripts/init_clickhouse.sh +++ b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/scripts/init_clickhouse.sh @@ -10,7 +10,7 @@ source "${PROJECT_DIR}/config.env" set +a # --- CONFIGURATION --- -CH_INSTALL_DIR="${PROJECT_DIR}/../../installation/clickhouse/clickhouse" +CH_INSTALL_DIR="${PROJECT_DIR}/../../Utilities/installation/clickhouse/clickhouse" CLICKHOUSE_BIN="${CH_INSTALL_DIR}/clickhouse" # Set Defaults if config variables are missing @@ -44,4 +44,4 @@ echo "Connecting to ${CH_HOST}:${CH_PORT}..." --port="${CH_PORT}" \ --multiquery < "${SQL_FILE}" -echo "ClickHouse initialization complete." \ No newline at end of file +echo "ClickHouse initialization complete." From be4599481b4ead85e6226c19d32700da63b744f9 Mon Sep 17 00:00:00 2001 From: STWang Date: Tue, 17 Mar 2026 14:48:03 -0600 Subject: [PATCH 2/4] fix path --- .../asap_query_latency/README.md | 22 +++++++++---------- .../asap_query_latency/run_benchmark.py | 8 +++++-- .../clickhouse-benchmark-pipeline/config.env | 2 +- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/asap-tools/execution-utilities/asap_query_latency/README.md b/asap-tools/execution-utilities/asap_query_latency/README.md index 042deed..8138514 100644 --- a/asap-tools/execution-utilities/asap_query_latency/README.md +++ b/asap-tools/execution-utilities/asap_query_latency/README.md @@ -34,17 +34,17 @@ export INSTALL_DIR=/scratch/sketch_db_for_prometheus cd ~/asap-internal/QueryEngineRust && cargo build --release # data_exporter -cd ~/asap-internal/ExecutionUtilities/clickhouse-benchmark-pipeline/data_exporter +cd ~/ASAPQuery/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/data_exporter cargo build --release ``` ### Download and chunk ClickBench data (one-time) ```bash -cd ~/asap-internal/ExecutionUtilities/clickhouse-benchmark-pipeline -python3 clickbench_importer/download_data.py +cd ~/ASAPQuery/asap-tools/execution-utilities/clickhouse-benchmark-pipeline +python3 benchmark_importer/download_data.py -DATA_DIR=~/asap-internal/ExecutionUtilities/clickhouse-benchmark-pipeline/clickbench_importer/data +DATA_DIR=~/ASAPQuery/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/benchmark_importer/data cd $DATA_DIR mv hits.json.gz hits_full.json.gz zcat hits_full.json.gz | head -n 1000000 | gzip > hits.json.gz @@ -54,7 +54,7 @@ zcat hits_full.json.gz | head -n 1000000 | gzip > hits.json.gz ```bash pip3 install --user requests matplotlib numpy -pip3 install --user ~/asap-internal/CommonDependencies/dependencies/py/promql_utilities/ +pip3 install --user ~/ASAPQuery/asap-common/dependencies/py/promql_utilities/ ``` --- @@ -111,7 +111,7 @@ python3 run_arroyosketch.py \ --input_kafka_topic hits \ --output_format json \ --pipeline_name asap_hits_pipeline \ - --config_file_path ~/asap-internal/ExecutionUtilities/asap_query_latency/streaming_config.yaml \ + --config_file_path ~/ASAPQuery/asap-tools/execution-utilities/asap_query_latency/streaming_config.yaml \ --output_kafka_topic sketch_topic \ --output_dir ./outputs \ --parallelism 1 \ @@ -124,8 +124,8 @@ python3 run_arroyosketch.py \ cd ~/asap-internal/QueryEngineRust nohup ./target/release/query_engine_rust \ --kafka-topic sketch_topic --input-format json \ - --config ~/asap-internal/ExecutionUtilities/asap_query_latency/inference_config.yaml \ - --streaming-config ~/asap-internal/ExecutionUtilities/asap_query_latency/streaming_config.yaml \ + --config ~/ASAPQuery/asap-tools/execution-utilities/asap_query_latency/inference_config.yaml \ + --streaming-config ~/ASAPQuery/asap-tools/execution-utilities/asap_query_latency/streaming_config.yaml \ --http-port 8088 --delete-existing-db --log-level DEBUG \ --output-dir ./output --streaming-engine arroyo \ --query-language SQL --lock-strategy per-key \ @@ -137,7 +137,7 @@ nohup ./target/release/query_engine_rust \ `data_exporter` reads all 1M records, transforms them (RFC3339 EventTime, stringify integer fields), sorts by EventTime, then sends to Kafka with event-time Kafka timestamps. This enables Arroyo's watermark to advance correctly for event-time windowing. ```bash -cd ~/asap-internal/ExecutionUtilities/clickhouse-benchmark-pipeline +cd ~/ASAPQuery/asap-tools/execution-utilities/clickhouse-benchmark-pipeline TOTAL_RECORDS=1000000 DATA_MODE=clickbench bash scripts/generate_data.sh ``` @@ -146,7 +146,7 @@ Wait for completion before running the benchmark. ### Step 9 — Run ASAP benchmark ```bash -cd ~/asap-internal/ExecutionUtilities/asap_query_latency +cd ~/ASAPQuery/asap-tools/execution-utilities/asap_query_latency ./run_benchmark.py \ --mode asap \ --sql-file asap_quantile_queries.sql \ @@ -165,7 +165,7 @@ $INSTALL_DIR/clickhouse client --query "SELECT count(*) FROM hits" Run the benchmark: ```bash -cd ~/asap-internal/ExecutionUtilities/asap_query_latency +cd ~/ASAPQuery/asap-tools/execution-utilities/asap_query_latency ./run_benchmark.py \ --mode baseline \ --sql-file clickhouse_quantile_queries.sql \ diff --git a/asap-tools/execution-utilities/asap_query_latency/run_benchmark.py b/asap-tools/execution-utilities/asap_query_latency/run_benchmark.py index 5ea950f..bc6986b 100755 --- a/asap-tools/execution-utilities/asap_query_latency/run_benchmark.py +++ b/asap-tools/execution-utilities/asap_query_latency/run_benchmark.py @@ -167,8 +167,12 @@ def load_clickbench_data(clickhouse_url: str): return True # Load data from hits.json.gz - data_file = Path( - "/users/STWang/asap-internal/ExecutionUtilities/clickhouse-benchmark-pipeline/clickbench_importer/data/hits.json.gz" + data_file = ( + Path(__file__).parent.parent + / "clickhouse-benchmark-pipeline" + / "benchmark_importer" + / "data" + / "hits.json.gz" ) if not data_file.exists(): print(f"✗ Data file not found: {data_file}") diff --git a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/config.env b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/config.env index 1b80243..756b0e5 100644 --- a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/config.env +++ b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/config.env @@ -21,7 +21,7 @@ FAKE_NUM_COUNTERS=100 # ClickBench Data CLICKBENCH_URL=https://datasets.clickhouse.com/hits_compatible/hits.json.gz CLICKBENCH_FILENAME=hits.json.gz -CLICKBENCH_DATA_DIR=clickbench_importer/data +CLICKBENCH_DATA_DIR=benchmark_importer/data # Benchmark BENCHMARK_QUERIES_FILE=benchmark_queries.sql From 978a080fdb187aa0d0bd27afb1d9883a11814227 Mon Sep 17 00:00:00 2001 From: STWang Date: Tue, 17 Mar 2026 14:54:22 -0600 Subject: [PATCH 3/4] fix path --- asap-tools/execution-utilities/asap_query_latency/README.md | 2 +- .../clickhouse-benchmark-pipeline/config.env | 2 +- .../clickhouse-benchmark-pipeline/scripts/generate_data.sh | 3 +-- .../clickhouse-benchmark-pipeline/scripts/init_clickhouse.sh | 3 +-- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/asap-tools/execution-utilities/asap_query_latency/README.md b/asap-tools/execution-utilities/asap_query_latency/README.md index 8138514..9937e57 100644 --- a/asap-tools/execution-utilities/asap_query_latency/README.md +++ b/asap-tools/execution-utilities/asap_query_latency/README.md @@ -89,7 +89,7 @@ $KAFKA/kafka-topics.sh --bootstrap-server localhost:9092 --create \ ### Step 4 — Init ClickHouse tables ```bash -cd ~/asap-internal/ExecutionUtilities/clickhouse-benchmark-pipeline +cd ~/ASAPQuery/asap-tools/execution-utilities/clickhouse-benchmark-pipeline CLICKHOUSE_BIN=$INSTALL_DIR/clickhouse bash scripts/init_clickhouse.sh ``` diff --git a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/config.env b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/config.env index 756b0e5..174e901 100644 --- a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/config.env +++ b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/config.env @@ -6,7 +6,7 @@ PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Kafka KAFKA_BROKER=localhost:9092 # Native Kafka KAFKA_TOPIC=hits -KAFKA_HOME="${PROJECT_DIR}/../../Utilities/installation/kafka/kafka" +KAFKA_HOME="${INSTALL_DIR}/kafka" # ClickHouse CLICKHOUSE_HOST=localhost diff --git a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/scripts/generate_data.sh b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/scripts/generate_data.sh index 7c519da..d80a180 100755 --- a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/scripts/generate_data.sh +++ b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/scripts/generate_data.sh @@ -20,8 +20,7 @@ set +a IMPORTER_DIR="${PROJECT_DIR}/benchmark_importer" DATA_DIR="${IMPORTER_DIR}/data" -# Hardcoded Kafka Path -KAFKA_HOME="${PROJECT_DIR}/../../Utilities/installation/kafka/kafka" +KAFKA_HOME="${INSTALL_DIR}/kafka" KAFKA_BIN="${KAFKA_HOME}/bin" # Check Mode diff --git a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/scripts/init_clickhouse.sh b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/scripts/init_clickhouse.sh index e1d54bd..11d57d8 100755 --- a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/scripts/init_clickhouse.sh +++ b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/scripts/init_clickhouse.sh @@ -10,8 +10,7 @@ source "${PROJECT_DIR}/config.env" set +a # --- CONFIGURATION --- -CH_INSTALL_DIR="${PROJECT_DIR}/../../Utilities/installation/clickhouse/clickhouse" -CLICKHOUSE_BIN="${CH_INSTALL_DIR}/clickhouse" +CLICKHOUSE_BIN="${CLICKHOUSE_BIN:-${INSTALL_DIR}/clickhouse}" # Set Defaults if config variables are missing CH_HOST="${CLICKHOUSE_HOST:-127.0.0.1}" From 41a64d742d771262d664eae9cb6cb83881b75028 Mon Sep 17 00:00:00 2001 From: STWang Date: Tue, 17 Mar 2026 14:59:37 -0600 Subject: [PATCH 4/4] fix path --- .../asap_query_latency/README.md | 16 ++++++++-------- .../clickhouse-benchmark-pipeline/README.md | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/asap-tools/execution-utilities/asap_query_latency/README.md b/asap-tools/execution-utilities/asap_query_latency/README.md index 9937e57..7fc17bd 100644 --- a/asap-tools/execution-utilities/asap_query_latency/README.md +++ b/asap-tools/execution-utilities/asap_query_latency/README.md @@ -31,7 +31,7 @@ export INSTALL_DIR=/scratch/sketch_db_for_prometheus ```bash # QueryEngineRust -cd ~/asap-internal/QueryEngineRust && cargo build --release +cd ~/ASAPQuery/asap-query-engine && cargo build --release # data_exporter cd ~/ASAPQuery/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/data_exporter @@ -66,7 +66,7 @@ pip3 install --user ~/ASAPQuery/asap-common/dependencies/py/promql_utilities/ ### Step 1 — Start Kafka ```bash -~/asap-internal/Utilities/installation/kafka/run.sh $INSTALL_DIR/kafka +~/ASAPQuery/asap-tools/installation/kafka/run.sh $INSTALL_DIR/kafka ``` ### Step 2 — Create Kafka topics @@ -83,7 +83,7 @@ $KAFKA/kafka-topics.sh --bootstrap-server localhost:9092 --create \ ### Step 3 — Start ClickHouse ```bash -~/asap-internal/Utilities/installation/clickhouse/run.sh $INSTALL_DIR +~/ASAPQuery/asap-tools/installation/clickhouse/run.sh $INSTALL_DIR ``` ### Step 4 — Init ClickHouse tables @@ -96,15 +96,15 @@ CLICKHOUSE_BIN=$INSTALL_DIR/clickhouse bash scripts/init_clickhouse.sh ### Step 5 — Start Arroyo cluster ```bash -~/asap-internal/arroyo/target/release/arroyo \ - --config ~/asap-internal/ArroyoSketch/config.yaml cluster \ +~/ASAPQuery/asap-sketch-ingest/target/release/arroyo \ + --config ~/ASAPQuery/asap-sketch-ingest/config.yaml cluster \ > /tmp/arroyo.log 2>&1 & ``` ### Step 6 — Create ArroyoSketch pipeline ```bash -cd ~/asap-internal/ArroyoSketch +cd ~/ASAPQuery/asap-sketch-ingest python3 run_arroyosketch.py \ --source_type kafka \ --kafka_input_format json \ @@ -121,7 +121,7 @@ python3 run_arroyosketch.py \ ### Step 7 — Start QueryEngineRust ```bash -cd ~/asap-internal/QueryEngineRust +cd ~/ASAPQuery/asap-query-engine nohup ./target/release/query_engine_rust \ --kafka-topic sketch_topic --input-format json \ --config ~/ASAPQuery/asap-tools/execution-utilities/asap_query_latency/inference_config.yaml \ @@ -195,7 +195,7 @@ $KAFKA/kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic hits $KAFKA/kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic sketch_topic # Delete old Arroyo pipeline -cd ~/asap-internal/ArroyoSketch +cd ~/ASAPQuery/asap-sketch-ingest python3 delete_pipeline.py --all_pipelines # Clear ClickHouse table diff --git a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/README.md b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/README.md index 93c2262..71fc405 100644 --- a/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/README.md +++ b/asap-tools/execution-utilities/clickhouse-benchmark-pipeline/README.md @@ -8,27 +8,27 @@ Install and run Kafka and ClickHouse natively (no Docker): ```bash # Install Kafka (one-time) -cd /path/to/Utilities/installation/kafka -./install.sh /path/to/Utilities/installation/kafka +cd ~/ASAPQuery/asap-tools/installation/kafka +./install.sh ~/ASAPQuery/asap-tools/installation/kafka # Install ClickHouse (one-time) -cd /path/to/Utilities/installation/clickhouse -./install.sh /path/to/Utilities/installation/clickhouse +cd ~/ASAPQuery/asap-tools/installation/clickhouse +./install.sh ~/ASAPQuery/asap-tools/installation/clickhouse ``` ## Usage ```bash # 1. Start Kafka (in a terminal) -cd /path/to/Utilities/installation/kafka +cd ~/ASAPQuery/asap-tools/installation/kafka ./run.sh kafka/ # 2. Create Kafka topic kafka/bin/kafka-topics.sh --create --topic hits --bootstrap-server localhost:9092 # 3. Start ClickHouse (in another terminal) -cd /path/to/Utilities/installation/clickhouse -./run.sh /path/to/Utilities/installation/clickhouse +cd ~/ASAPQuery/asap-tools/installation/clickhouse +./run.sh ~/ASAPQuery/asap-tools/installation/clickhouse # 4. Initialize ClickHouse tables ./scripts/init_clickhouse.sh @@ -61,7 +61,7 @@ Edit `config.env` to change defaults. Environment variables override config valu Follow instructions to install Elasticsearch: ```bash -cd /path/to/Utilities/installation/elastic +cd ~/ASAPQuery/asap-tools/installation/elastic ``` ## Configuration