`IcebergWriteExec` and `CometIcebergWriteExec` are marked with `!` (missing input) in EXPLAIN
Les mainteneurs répondent en général sous 2 jours
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 65/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- scala
- Domaine
- data-engineering
Piste de recherche
Les deux nœuds d'écriture sont IcebergWriteExec et CometIcebergWriteExec ; le ticket indique que les deux reçoivent output comme argument du constructeur sans redéfinir producedAttributes. Regarde CometProjectExec pour voir comment cette redéfinition est déjà faite. Reproduis ensuite avec les commandes EXPLAIN du ticket et vérifie que missingInput est vide. C'est terminé lorsque le préfixe ! disparaît et qu'une assertion sur missingInput.isEmpty passe dans un test d'écriture existant de CometIcebergWriteActionSuite.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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
- Langage dominant
- Scala
- Étoiles
- 1.3k
- Forks
- 418
- Merge moyen
- 2 j 23 h
- PR mergées (30 j)
- 158
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de apache/datafusion-comet
-
Native MergeRows can panic or produce wrong masks - arrow 59 `and_not` mishandles sliced arraysOuverterequires-triage
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
apache/datafusion-comet#7596 ·
Les mainteneurs répondent en général sous 2 jours
-
requires-triage
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
apache/datafusion-comet#7583 ·
Les mainteneurs répondent en général sous 2 jours
-
bug priority:medium
Difficulté 2/5 1-3 heures Accessibilité débutants 73/100
apache/datafusion-comet#7559 · 2 commentaires ·
Les mainteneurs répondent en général sous 2 jours
-
area:writer bug priority:low
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
apache/datafusion-comet#7558 ·
Les mainteneurs répondent en général sous 2 jours
-
Comet Native Executors: run a query in Spark when Comet is turned offPeut-être pris @andygrove l’a pris il y a 8 jours. Ouverteenhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
apache/datafusion-comet#7557 ·
Les mainteneurs répondent en général sous 2 jours
Toutes les issues de apache/datafusion-comet
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
lichess-org/lila#22506 · 1 réaction ·
Les mainteneurs répondent en général sous 1 jour
-
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
Difficulté 1/5 Moins d'une heure Accessibilité débutants 68/100
Huerte/algo-solutions-python#260 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
cpp-best-practices/project_validator#245 ·
Les mainteneurs répondent en général sous 1 jour
-
python 🐍 Task 🔧
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
valkey-io/valkey-glide#7709 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
zio/zio-logging#1181 ·
Les mainteneurs répondent en général sous 1 jour