manuzhang commented on code in PR #214:
URL: https://github.com/apache/datafusion-site/pull/214#discussion_r4385755431


##########
content/blog/2026-10-25-comet-nested-tpch.md:
##########
@@ -0,0 +1,210 @@
+---
+layout: post
+title: Announcing a derived TPC-H, a benchmark for nested data in Apache 
DataFusion Comet
+date: 2026-10-25
+author: pmc
+categories: [performance, benchmarks]
+---
+
+<!--
+{% comment %}
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to you under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+{% endcomment %}
+-->
+
+[TOC]
+
+Query engines get fast at what their benchmarks measure, and the most widely 
used analytical benchmarks contain no nested data. Apache DataFusion Comet now 
runs all 22 queries of a nested TPC-H at scale factor 1000 (1 TB) in 777 s, 
against 1,515 s for Spark. Before the fixes this benchmark exposed, it took 
1,088 s.
+
+<img
+src="../images/comet-nested-tpch/intro-total.svg"
+width="100%"
+class="img-fluid"
+alt="Total execution time at SF1000: Spark 1,515.0 s, Comet nested unoptimized 
1,087.5 s, Comet nested optimized 777.2 s"
+/>
+
+Nested TPC-H is a TPC-H derived benchmark in the Comet repository 
([#7044](https://github.com/apache/datafusion-comet/pull/7044)). It keeps the 
TPC-H data and questions and changes only the shape of the tables. The data and 
queries are engine neutral, so they can be used to compare Spark, Comet and 
other engines.
+
+We built it because our benchmarks and our users disagreed. Comet tracked its 
performance with TPC-H and TPC-DS, and the numbers were encouraging. Real user 
pipelines showed smaller gains, or none at all. What those pipelines had in 
common was nested data, which neither benchmark contains.
+
+So we started experimenting with nested benchmarks in Comet to see where the 
gaps were. The first runs showed them: some queries ran slower on Comet than on 
Spark, even though Comet accelerates the same queries on flat TPC-H.
+
+## Why: TPC-H is flat, real data is not
+
+[TPC-H](https://www.tpc.org/tpch/) is one of the most cited analytical 
benchmarks, and its schema is flat: eight normalized tables with primitive 
columns. Its 22 queries exercise well-understood choke points such as 
aggregation, join ordering and correlated subqueries (Boncz, Neumann and 
Erling, "TPC-H Analyzed", TPCTC 2013).
+
+Real data is often nested. Event logs, JSON, Avro and Protobuf records, and 
many data lake tables are full of structs and arrays, which Parquet stores with 
the record shredding scheme from Dremel (Melnik et al., VLDB 2010). Nested data 
adds work that flat benchmarks never exercise:
+
+- **Reading.** Rebuilding list offsets and validity bitmaps from repetition 
and definition levels, and decoding only the fields a query uses.
+- **Planning.** Nested column pruning and predicate pushdown through `explode`.
+- **Operators.** `explode`, field access, and sort, join and exchange over 
wide variable-size values.
+- **Memory and spilling.** Variable-size values make memory use and spill 
volume harder to predict.
+- **Conversion.** Moving nested values between a JVM and a native 
representation.
+
+Comet hit the shuffle case in 
[#5397](https://github.com/apache/datafusion-comet/issues/5397), where native 
shuffle writes of wide nested fields were two to three times slower than 
Spark's. The issue notes that it was "invisible for TPC-* benchmarks because of 
historical flat schema".
+
+We needed a benchmark that fills the gap between academic benchmarking and 
real user workloads.
+
+## How: an adapter that nests TPC-H
+
+We did not want to invent a new benchmark from scratch. TPC-H is well 
understood, widely published and easy to generate, and its business shape 
(customers, orders, line items, suppliers and parts) is what makes its results 
meaningful. The goal was to preserve that shape and those questions while 
making every query process nested data.
+
+The idea turned out to be surprisingly simple: a transformation of both the 
data and the queries that leaves the key and partition columns at the top level 
and nests everything else. The partition columns are `p_brand`, `c_mktsegment`, 
`o_orderdate` and `l_shipdate`, and every other non-key column moves into one 
`array<struct>` named `<table>_data`. Each array holds exactly one element, so 
exploding it never changes the row count and the queries return the same 
answers as TPC-H. For `lineitem`:
+
+```
+-- flat                               -- nested
+l_orderkey       BIGINT               l_orderkey     BIGINT
+l_partkey        BIGINT               l_partkey      BIGINT
+l_suppkey        BIGINT               l_suppkey      BIGINT
+l_linenumber     INT                  l_shipdate     DATE        -- partition 
column
+l_quantity       DECIMAL(12,2)        lineitem_data  ARRAY<STRUCT<
+l_extendedprice  DECIMAL(12,2)            l_linenumber: INT,
+l_discount       DECIMAL(12,2)            l_quantity: DECIMAL(12,2),
+l_tax            DECIMAL(12,2)            l_extendedprice: DECIMAL(12,2),
+l_returnflag     STRING                   l_discount: DECIMAL(12,2),
+l_linestatus     STRING                   l_tax: DECIMAL(12,2),
+l_shipdate       DATE                     l_returnflag: STRING,
+l_commitdate     DATE                     l_linestatus: STRING,
+l_receiptdate    DATE                     l_commitdate: DATE,
+l_shipinstruct   STRING                   l_receiptdate: DATE,
+l_shipmode       STRING                   l_shipinstruct: STRING,
+l_comment        STRING                   l_shipmode: STRING,
+                                          l_comment: STRING>>
+```
+
+Each of the 22 queries is rewritten to unnest only the arrays it needs. The 
queries are in 
[`benchmarks/nested/queries`](https://github.com/apache/datafusion-comet/tree/main/benchmarks/nested/queries).
+
+```sql
+from (select l_orderkey, l_partkey, l_suppkey, l_shipdate,
+             explode(lineitem_data) as lineitem_data from lineitem) as lineitem
+where lineitem_data.l_quantity < 24
+```
+
+[`nest_tpch.scala`](https://github.com/apache/datafusion-comet/blob/main/benchmarks/nested/scripts/nest_tpch.scala)
 converts an existing flat TPC-H dataset to the nested layout. The source and 
the target can each be Parquet or Iceberg. The script runs under `spark-shell` 
on a laptop or a cluster, casts columns to fixed types, writes zstd-compressed 
Parquet with 512 MiB row groups, partitions by the columns above and checks row 
counts:
+
+```bash
+spark-shell -i scripts/nest_tpch.scala \
+  --conf spark.nesttpch.source=parquet:/data/tpch/sf10 \
+  --conf spark.nesttpch.target=parquet:/data/tpch-nested/sf10
+```
+
+The 
[README](https://github.com/apache/datafusion-comet/tree/main/benchmarks/nested)
 has the Iceberg variants and all settings.
+
+## Benchmark setup
+
+- **Data**: nested TPC-H, scale factor 1000 (1 TB).
+- **Tables**: Apache Iceberg tables with zstd-compressed Parquet data files on 
S3, created with `nest_tpch.scala`. Comet reads them with its native Iceberg 
scan, which is built on [iceberg-rust](https://github.com/apache/iceberg-rust).
+- **Cluster**: Kubernetes with 16-core executors.
+- **Method**: one run per configuration, three iterations per query. Figures 
are the fastest iteration, and totals are sums of the per-query times.
+- **Spark**: Spark 4.0
+- **Comet nested unoptimized**: Comet 1.1.0 snapshot (revision `a50fe3aea863`)

Review Comment:
   The dashboard shows the Comet 1.1.0 test is running on Spark 3.4? Are the 
two cases on the same Spark base?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to