[Bug] hll_sketch_agg, hll_union and hll_union_agg write compact sketch bytes where Spark writes updatable ones

オープン
#7,548 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 2 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
57/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
rust, scala
領域
backend, databases

調査の方向性

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.

索引モデルが issue の本文から書いたものです。

説明

area:aggregation area:expressions bug priority:medium
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.writableWrap rejects Comet's output because it only accepts updatable images (HllSketch.java:251-254 in 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:

  1. Add an updatable serialization to datasketches-rust (https://github.com/apache/datasketches-rust ) and use it in Comet.
  2. 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

主要言語
Scala
スター
1.3k
フォーク
414
平均マージ
3日 5時間
マージ済み PR(30日)
210

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

apache/datafusion-comet のほかの issue

apache/datafusion-comet の issue をすべて見る

似ている issue

Scala の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。