[Bug] hll_sketch_agg, hll_union and hll_union_agg write compact sketch bytes where Spark writes updatable ones
Maintainer thường phản hồi trong vòng 2 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 57/100
Hướng nghiên cứu
Read the affected files listed in the issue: native/spark-expr/src/agg_funcs/hll_sketch.rs, hll_sketch_agg.rs, hll_union_agg.rs, native/spark-expr/src/hll_scalar.rs, and the CometHll serdes under spark/src/main/spark-4.x/org/apache/comet/serde/. Start by tracing how these expressions serialize LIST and SET sketches and compare the bytes with Spark's output. Done means the returned bytes use Spark's updatable layout and match Spark for the reproduced query.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Describe the bug
On Spark 4.x, Comet's native hll_sketch_agg, hll_union and hll_union_agg return sketch bytes that differ from Spark's when the sketch is still in LIST or SET mode (a small number of distinct values).
Spark returns HllSketch.toUpdatableByteArray, which is documented as the "updatable binary representation". The datasketches crate (0.6.0) has only a compact serialize(). For LIST and SET it sets COMPACT_FLAG and writes the compact layout (list.rs:131, hash_set.rs:163).
Both layouts decode to the same sketch, so hll_sketch_estimate and hll_union read either one correctly and the estimates match. The bytes themselves still differ, so:
- any query that compares, groups by, hashes, or stores the raw sketch bytes gets a different result under Comet;
- DataSketches-Java
HllSketch.writableWraprejects Comet's output because it only accepts updatable images (HllSketch.java:251-254in 6.2.0).
This is why these three expressions still need spark.comet.expression.<name>.allowIncompatible=true after the audit in https://github.com/apache/datafusion-comet/issues/7396 .
Steps to reproduce
-- Spark 4.1, few distinct values -> LIST mode
SELECT hex(hll_sketch_agg(col)) FROM VALUES (1), (2), (3) AS t(col);
Run it once with Comet disabled and once with spark.comet.expression.HllSketchAgg.allowIncompatible=true. The hex strings differ: Comet sets COMPACT_FLAG and writes only the coupons, while Spark writes the updatable layout. hll_sketch_estimate returns 3 in both cases.
Comparison experiment (DataSketches-Java 6.1.1 and 6.2.0 vs Comet with datasketches 0.6.0, 4030 cases): https://github.com/tlfua/datafusion-comet/actions/runs/42348769378 . Summary: https://github.com/apache/datafusion-comet/issues/7396#issuecomment-6703600973 .
Expected behavior
Comet writes the same updatable layout as Spark, so the bytes match and these expressions can run without the opt-in.
Possible fixes:
- Add an updatable serialization to datasketches-rust (https://github.com/apache/datasketches-rust ) and use it in Comet.
- Re-encode LIST/SET sketches into the updatable layout in Comet before returning them.
Additional context
Surfaced by the HLL audit for https://github.com/apache/datafusion-comet/issues/7396 . Affected Comet files: native/spark-expr/src/agg_funcs/hll_sketch.rs, hll_sketch_agg.rs, hll_union_agg.rs, native/spark-expr/src/hll_scalar.rs and the CometHll* serdes under spark/src/main/spark-4.x/org/apache/comet/serde/.
Separately, the estimate after merging partial sketches can differ by up to 0.81% (hll_sketch_agg with more than one partition) because SET-to-HLL promotion during a union visits coupons in a different order. Spark's own estimate for the same input changes with partitioning by a similar or larger amount.
Willingness to contribute
I would be willing to contribute a fix for this bug with guidance from the DataFusion community
- Ngôn ngữ chính
- Scala
- Star
- 1.3k
- Fork
- 414
- Merge trung bình
- 3 ngày 5 giờ
- Pull request đã merge (30 ngày)
- 210
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của apache/datafusion-comet
-
requires-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
apache/datafusion-comet#7583 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
bug priority:medium
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 73/100
apache/datafusion-comet#7559 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 2 ngày
-
area:writer bug priority:low
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
apache/datafusion-comet#7558 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
apache/datafusion-comet#7557 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
`rand` and `randn` with an integer seed fall back to Spark without a fallback reasonCó thể đã có người làm @galaxytemple đã nhận 3 ngày trước. Đang mởrequires-triage
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
apache/datafusion-comet#7479 · 1 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 2 ngày
Tất cả issue của apache/datafusion-comet
Issue tương tự
-
A-api C-bug S-ready-for-human
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
ergoplatform/ergo#2932 ·
Maintainer thường phản hồi trong vòng 3 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
lichess-org/lila#22454 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
chipsalliance/rocket-chip#3845 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 86/100
Maintainer thường phản hồi trong vòng 13 ngày