`IcebergWriteExec` and `CometIcebergWriteExec` are marked with `!` (missing input) in EXPLAIN
Maintainer antworten meist innerhalb von 2 Tagen
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 65/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- scala
- Bereich
- data-engineering
Rechercherichtung
Die beiden Schreibknoten sind IcebergWriteExec und CometIcebergWriteExec; das Issue besagt, dass beide output als Konstruktorargument übernehmen, ohne producedAttributes zu überschreiben. Schau dir CometProjectExec an, um zu sehen, wie diese Überschreibung bereits umgesetzt ist. Reproduziere dann mit den EXPLAIN-Befehlen aus dem Issue und prüfe, dass missingInput leer ist. Fertig ist, wenn das !-Präfix verschwunden ist und eine Assertion auf missingInput.isEmpty in einem vorhandenen Schreibtest von CometIcebergWriteActionSuite durchläuft.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Describe the bug
In the split Iceberg write plan, both write nodes are printed with Spark's ! prefix, which marks a node whose input attributes are missing:
IcebergCommit IcebergBatchWrite(table=local.db.dst, format=PARQUET), ...
+- AdaptiveSparkPlan isFinalPlan=false
+- !CometIcebergWrite [iceberg_commit_message#303], ...
Both nodes take output (the iceberg_commit_message attribute) as a constructor argument but don't override producedAttributes. Spark therefore counts that attribute in references, and since no child produces it, missingInput is non-empty. The write itself runs correctly; the plan only looks broken.
This is the same class of issue as #2214 (CometHashAggregate) and #2789 (CometWindowExec).
Steps to reproduce
Comet main at 4de670439, Spark 4.1.3, Iceberg 1.11.0, spark-shell with a Hadoop catalog named local and spark.comet.write.iceberg.enabled=true:
spark.sql("CREATE TABLE local.db.src (id INT, amount INT) USING iceberg")
spark.sql("INSERT INTO local.db.src VALUES (1, 10), (2, 20)")
spark.sql("CREATE TABLE local.db.dst (id INT, amount INT) USING iceberg")
spark.sql("CREATE TABLE local.db.dst_orc (id INT, amount INT) USING iceberg TBLPROPERTIES ('write.format.default'='orc')")
// native write
spark.sql("EXPLAIN INSERT INTO local.db.dst SELECT * FROM local.db.src")
// ORC is not written natively, so the write stays on iceberg-java
spark.sql("EXPLAIN INSERT INTO local.db.dst_orc SELECT * FROM local.db.src")
Native write:
== Physical Plan ==
IcebergCommit IcebergBatchWrite(table=local.db.dst, format=PARQUET), IcebergWrite(table=local.db.dst, format=PARQUET), org.apache.comet.iceberg.IcebergWriteStrategy$$Lambda/0x00000070021c8ba8@1b766d44
+- !CometIcebergWrite [iceberg_commit_message#303], /tmp/iceberg-warehouse/db/dst/data, ICEBERG_WRITER_UNPARTITIONED
+- CometIcebergNativeScan [id#292, amount#293], /tmp/iceberg-warehouse/db/src/metadata/v2.metadata.json, IcebergScan(table=local.db.src, schemaId=0, snapshotId=7721505751242735037, branch=null, filters=, runtimeFilters=, groupedBy=), 2
Fallback to iceberg-java:
== Physical Plan ==
IcebergCommit IcebergBatchWrite(table=local.db.dst_orc, format=ORC), IcebergWrite(table=local.db.dst_orc, format=ORC), org.apache.comet.iceberg.IcebergWriteStrategy$$Lambda/0x00000070021c8ba8@4ba48bc7
+- !IcebergWrite IcebergBatchWrite(table=local.db.dst_orc, format=ORC), [iceberg_commit_message#322], PlainIcebergWrite
+- *(1) CometColumnarToRow
+- CometIcebergNativeScan [id#311, amount#312], /tmp/iceberg-warehouse/db/src/metadata/v2.metadata.json, IcebergScan(table=local.db.src, schemaId=0, snapshotId=7721505751242735037, branch=null, filters=, runtimeFilters=, groupedBy=), 2
Expected behavior
No ! on IcebergWrite and CometIcebergWrite: the commit-message attribute is produced by the node itself, so missingInput should be empty.
Additional context
Proposed fix: override def producedAttributes: AttributeSet = outputSet in IcebergWriteExec and CometIcebergWriteExec, as CometProjectExec already does, plus a test that asserts missingInput.isEmpty for both nodes in an existing CometIcebergWriteActionSuite write.
Willingness to contribute
I can contribute a fix for this bug independently
- Vorherrschende Sprache
- Scala
- Sterne
- 1.3k
- Forks
- 418
- Ø Merge
- 2 T. 23 Std.
- Gemergte PRs (30 T.)
- 158
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus apache/datafusion-comet
-
Native MergeRows can panic or produce wrong masks - arrow 59 `and_not` mishandles sliced arraysOffenrequires-triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
apache/datafusion-comet#7596 ·
Maintainer antworten meist innerhalb von 2 Tagen
-
requires-triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
apache/datafusion-comet#7583 ·
Maintainer antworten meist innerhalb von 2 Tagen
-
bug priority:medium
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 73/100
apache/datafusion-comet#7559 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 2 Tagen
-
area:writer bug priority:low
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
apache/datafusion-comet#7558 ·
Maintainer antworten meist innerhalb von 2 Tagen
-
Comet Native Executors: run a query in Spark when Comet is turned offEvtl. vergeben @andygrove hat das vor 8 Tagen übernommen. Offenenhancement
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
apache/datafusion-comet#7557 ·
Maintainer antworten meist innerhalb von 2 Tagen
Alle Issues in apache/datafusion-comet
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 66/100
lichess-org/lila#22506 · 1 Reaktion ·
Maintainer antworten meist innerhalb von 1 Tag
-
15-minutes 5-minutes algorithm any-language beginner-friendly c cpp csharp easy go good first issue hacktoberfest help wanted java javascript kotlin python rust swift typescript
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 68/100
Huerte/algo-solutions-python#260 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
cpp-best-practices/project_validator#245 ·
Maintainer antworten meist innerhalb von 1 Tag
-
python 🐍 Task 🔧
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
valkey-io/valkey-glide#7709 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
zio/zio-logging#1181 ·
Maintainer antworten meist innerhalb von 1 Tag