build: enable Spark SQL tests for released Spark 4.2.0#4950
Draft
andygrove wants to merge 10 commits into
Draft
Conversation
Adds dev/diffs/4.2.0-preview4.diff so the Spark SQL test suite can run against Apache Spark 4.2.0-preview4 with Comet enabled, and wires the 4.2 profile into the spark_sql_test workflow matrix. The diff was seeded from 4.1.1.diff and reconciled against v4.2.0-preview4.
Inherited from 4.1.1.diff during reconciliation. The Spark build was trying to resolve comet-spark-spark4.1_2.13 instead of the 4.2 artifact, causing the sql_hive jobs to fail before any tests ran.
Spark 4.2 removes GeographyVal / GeometryVal and replaces the getGeography and getGeometry accessors on SpecializedGetters with a single getBinaryView returning BinaryView. The shim therefore can no longer be shared between 4.1 and 4.2 out of the spark-4.1+ source root: the major, minor-plus and minor shim directories are all added as compile source roots, so a spark-4.2 copy would be a duplicate class rather than an override. Move the trait into per-version spark-4.1 and spark-4.2 copies.
Point spark.version at the released 4.2.0 instead of 4.2.0-preview4. Spark 4.2.0 bundles its own copy of org.apache.datasketches.memory.internal.ResourceImpl inside spark-catalyst, which collides with the transitive datasketches-memory jar and fails the maven-enforcer BanDuplicateClasses rule, so ignore that class. Keep the test-scope Jetty pin at 11.0.26. Spark 4.2.0 ships Jetty 12, but the Iceberg REST catalog test helper needs jetty-servlet, which Jetty 12 replaced with jetty-ee10-servlet.
Reseed the Spark SQL test overrides from 4.1.2.diff against the v4.2.0 tag and drop the 4.2.0-preview4 diff. The notable reconciliation is the test harness refactor: Spark 4.2 shrinks SQLTestUtils to a deprecated empty alias and moves withSQLConf, stripSparkFilter and the test() override into QueryTest, with SharedSparkSession now extending QueryTest directly. Comet's hooks (isCometEnabled, the IgnoreComet skip and the stripSparkFilter Comet cases) move to QueryTest accordingly. isCometEnabled has to qualify classic.SparkSession there, since a bare SparkSession in that package resolves to the unified class.
Regenerated with dev/regenerate-golden-files.sh --spark-version 4.2. The q2, q5, q54 (v1_4) and q5a (v2_7) goldens are pruned: their plans now match the shared fallback under the released 4.2.0, so the divergences seen on 4.2.0-preview4 are gone. q77a (v2_7) is added because Spark 4.2 plans a OneRowRelation into its Union branches. Comet cannot convert that leaf, so the Unions fall back and the aggregates above them lose their Comet partial producer. The approved plan records the degraded plan; see apache#4949.
Add a spark_4_2 job to the ci.yml umbrella calling spark_sql_test_reusable.yml with Spark 4.2.0 on JDK 17, plus the matching spark_4_2 filter in compute-changes.py and output on the changes job. Gate it behind the run-spark-4.2-tests label so it runs on pushes to main but stays off the default PR path while 4.2 support is experimental. Update the user guide for the released 4.2.0 and refresh the new-Spark-version contributor guide, which still described the spark_sql_test.yml matrix that was replaced by the per-version umbrella jobs.
The preflight job only proceeds on a labeled event for known gating labels. Without run-spark-4.2-tests in that allowlist, labelling a PR to request the Spark 4.2 SQL tests skipped the whole pipeline instead of running them.
Comment on lines
+268
to
+284
| spark_4_2: | ||
| name: Spark SQL Tests (Spark 4.2) | ||
| needs: changes | ||
| # Main-only by default; PRs need the `run-spark-4.2-tests` label. Spark 4.2 | ||
| # support is still experimental, so keep it off the default PR path. | ||
| if: | | ||
| needs.changes.outputs.spark_4_2 == 'true' && | ||
| (github.event_name == 'push' || | ||
| github.event_name == 'workflow_dispatch' || | ||
| (github.event_name == 'pull_request' && | ||
| contains(github.event.pull_request.labels.*.name, 'run-spark-4.2-tests'))) | ||
| uses: ./.github/workflows/spark_sql_test_reusable.yml | ||
| with: | ||
| spark-short: '4.2' | ||
| spark-full: '4.2.0' | ||
| java: 17 | ||
|
|
andygrove
marked this pull request as draft
July 17, 2026 15:57
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Which issue does this PR close?
Part of #4142.
Supersedes #4208, which was opened against
4.2.0-preview4and went stale.Rationale for this change
Spark 4.2.0 is now available in Maven Central, so the
spark-4.2profile no longer has to target a preview. This is stage 3 of the bring-up described inadding_a_new_spark_version.md: turn on Spark's own SQL tests for 4.2 and move the profile onto the released version.Spark 4.2.0 is not simply
4.2.0-preview4with the qualifier dropped. It restructures the test harness, changesSpecializedGetters, and repackages a dependency, so several real reconciliations were needed.What changes are included in this PR?
Build
spark.versionmoves from4.2.0-preview4to4.2.0.org.apache.datasketches.memory.internal.ResourceImplinsidespark-catalyst, colliding with the transitivedatasketches-memoryjar and failing theBanDuplicateClassesenforcer rule. That class is now ignored.jetty-servlet, which Jetty 12 replaced withjetty-ee10-servlet. The stale comment claiming the pin matched preview4's Jetty version is corrected.Shims
GeographyVal/GeometryValand replacesgetGeography/getGeometryonSpecializedGetterswith a singlegetBinaryViewreturningBinaryView.CometInternalRowShimcan no longer be shared from thespark-4.1+source root, because the major, minor-plus and minor shim directories are all compile source roots (aspark-4.2copy would be a duplicate class, not an override). It is split into per-versionspark-4.1andspark-4.2copies.Spark SQL test diff
dev/diffs/4.2.0.diffreplacesdev/diffs/4.2.0-preview4.diff, reseeded from4.1.2.diffagainst thev4.2.0tag.SQLTestUtilsshrinks to a deprecated empty alias, andwithSQLConf,stripSparkFilterand thetest()override move intoQueryTest, withSharedSparkSessionnow extendingQueryTestdirectly. Comet's hooks (isCometEnabled, theIgnoreCometskip, and thestripSparkFilterComet cases) move toQueryTestaccordingly.isCometEnabledmust qualifyclassic.SparkSession, since a bareSparkSessionin that package resolves to the unified class.KeyGroupedPartitioningSuiteneeds no Comet change any more: 4.2 already declarescollectAllShuffles/collectShufflesasprotectedreturningSeq[ShuffleExchangeLike].HiveUDFDynamicLoadSuitedrops Comet's commented-outassume: 4.2 addsTestHiveUdfsJar, which buildshive-test-udfs.jarfrom Java sources at runtime, so the stripped-jar workaround is obsolete.CI
spark_4_2job to theci.ymlumbrella callingspark_sql_test_reusable.yml(Spark 4.2.0, JDK 17), plus the matchingspark_4_2filter incompute-changes.pyand output on thechangesjob. It is gated behind arun-spark-4.2-testslabel so it runs on pushes tomainbut stays off the default PR path while 4.2 is experimental.Plan stability
dev/regenerate-golden-files.sh --spark-version 4.2. Theq2,q5,q54(v1_4) andq5a(v2_7) goldens are pruned because their plans now match the shared fallback on the released 4.2.0, so the preview4-era divergences are gone.q77a(v2_7) is added and records a degraded plan: Spark 4.2 plans aOneRowRelationinto itsUnionbranches, which Comet cannot convert, so theUnions fall back and the aggregates above lose their Comet partial producer. Tracked in Spark 4.2:OneRowRelationin Union branches forces Union and downstream aggregates off Comet (TPC-DS q77a) #4949 and to be removed when that is fixed.Docs
spark_sql_test.ymlmatrix, which has since been replaced by the per-version umbrella jobs; it now documents theci.yml+compute-changes.pywiring.How are these changes tested?
./mvnw -Pspark-4.2 installagainst the released 4.2.0 builds clean, as does-Pspark-4.1, confirming the shim split does not regress 4.1.dev/diffs/4.2.0.diffwas verified to apply with no rejects to a pristinev4.2.0checkout, and patches the same 95 files as4.1.2.diff, differing only by the expectedSQLTestUtilstoQueryTestswap.CometTPCDSV1_4_PlanStabilitySuiteandCometTPCDSV2_7_PlanStabilitySuitepass under-Pspark-4.2(103 and 32 tests, no failures).spark_4_2job exercises the diff in CI; therun-spark-4.2-testslabel is applied to this PR.