[ 
https://issues.apache.org/jira/browse/SPARK-58998?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Hyukjin Kwon updated SPARK-58998:
---------------------------------
    Description: 
Follow-up to SPARK-58987 (which added the ours-only parity gate + coverage 
tooling).

Two findings from the coverage work:
h2. 1. The parity gate covers the wire, not our high-level API
The transport-injection harness swaps only the gRPC stub, so the official suite 
runs the REFERENCE pyspark DataFrame/Session/Column classes and only routes 
bytes through our Rust stub. Our high-level API (spark-connect 
DataFrame/Session/Catalog/... and the pyspark-rs bindings) is therefore NOT 
exercised by it - merged coverage is ~49%, with those modules near 0-20% while 
the wire layer (client/error/retries/channel/bytes_codec) is 90%+.

h2. 2. The drop-in pyspark API diverges from reference pyspark
The skin re-exports the Rust PyO3 classes directly, and their API is 
name-divergent and incomplete vs reference pyspark, e.g.:
* SparkSession: no `conf`, no `read` (only `readStream`); `catalog` is a 
method, not a property
* DataFrame: `where_` not `where`; missing `withColumns`, `hint`, 
`unpivot`/`melt`, `intersectAll`; `head()` takes no count; `createDataFrame` 
accepts only a list of column names (no StructType/DDL)
* Column: `is_null`/`is_not_null`/`get_field` (snake_case) not 
`isNull`/`isNotNull`/`getField`
* GroupedData: no `pivot`
The origin project reached full parity via a skin adapter layer; the fork 
appears to have lost it. `df.where(...)`, `col.isNull()`, `spark.read`, etc. 
would break for users.

h2. Work
* Restore a faithful drop-in skin (adapter wrappers: where_->where, 
is_null->isNull, add 
conf/read/pivot/withColumns/hint/unpivot/intersectAll/head(n)/StructType-createDataFrame,
 catalog as a property).
* Add high-level API tests (Rust golden+e2e for the spark-connect API; a 
drop-in Python exercise, scripts/e2e_wrapper.py, for the pyspark-rs bindings).
* Raise the rust-coverage CI gate (scripts/rust_coverage.sh, added in 
SPARK-58987) to 90%.

UPDATE: delivered together with SPARK-58987 in apache/spark-connect-rust#54 
(drop-in API fidelity + complete Arrow type mapping + the coverage gate).

  was:
Follow-up to SPARK-58987 (which added the ours-only parity gate + coverage 
tooling).

Two findings from the coverage work:
h2. 1. The parity gate covers the wire, not our high-level API
The transport-injection harness swaps only the gRPC stub, so the official suite 
runs the REFERENCE pyspark DataFrame/Session/Column classes and only routes 
bytes through our Rust stub. Our high-level API (spark-connect 
DataFrame/Session/Catalog/... and the pyspark-rs bindings) is therefore NOT 
exercised by it - merged coverage is ~49%, with those modules near 0-20% while 
the wire layer (client/error/retries/channel/bytes_codec) is 90%+.

h2. 2. The drop-in pyspark API diverges from reference pyspark
The skin re-exports the Rust PyO3 classes directly, and their API is 
name-divergent and incomplete vs reference pyspark, e.g.:
* SparkSession: no `conf`, no `read` (only `readStream`); `catalog` is a 
method, not a property
* DataFrame: `where_` not `where`; missing `withColumns`, `hint`, 
`unpivot`/`melt`, `intersectAll`; `head()` takes no count; `createDataFrame` 
accepts only a list of column names (no StructType/DDL)
* Column: `is_null`/`is_not_null`/`get_field` (snake_case) not 
`isNull`/`isNotNull`/`getField`
* GroupedData: no `pivot`
The origin project reached full parity via a skin adapter layer; the fork 
appears to have lost it. `df.where(...)`, `col.isNull()`, `spark.read`, etc. 
would break for users.

h2. Work
* Restore a faithful drop-in skin (adapter wrappers: where_->where, 
is_null->isNull, add 
conf/read/pivot/withColumns/hint/unpivot/intersectAll/head(n)/StructType-createDataFrame,
 catalog as a property).
* Add high-level API tests (Rust golden+e2e for the spark-connect API; a 
drop-in Python exercise, scripts/e2e_wrapper.py, for the pyspark-rs bindings).
* Raise the rust-coverage CI gate (scripts/rust_coverage.sh, added in 
SPARK-58987) to 90%.


> [spark-connect-rust] Drop-in pyspark API fidelity + high-level API test 
> coverage
> --------------------------------------------------------------------------------
>
>                 Key: SPARK-58998
>                 URL: https://issues.apache.org/jira/browse/SPARK-58998
>             Project: Spark
>          Issue Type: Improvement
>          Components: Project Infra
>    Affects Versions: 5.0.0
>            Reporter: Hyukjin Kwon
>            Priority: Major
>
> Follow-up to SPARK-58987 (which added the ours-only parity gate + coverage 
> tooling).
> Two findings from the coverage work:
> h2. 1. The parity gate covers the wire, not our high-level API
> The transport-injection harness swaps only the gRPC stub, so the official 
> suite runs the REFERENCE pyspark DataFrame/Session/Column classes and only 
> routes bytes through our Rust stub. Our high-level API (spark-connect 
> DataFrame/Session/Catalog/... and the pyspark-rs bindings) is therefore NOT 
> exercised by it - merged coverage is ~49%, with those modules near 0-20% 
> while the wire layer (client/error/retries/channel/bytes_codec) is 90%+.
> h2. 2. The drop-in pyspark API diverges from reference pyspark
> The skin re-exports the Rust PyO3 classes directly, and their API is 
> name-divergent and incomplete vs reference pyspark, e.g.:
> * SparkSession: no `conf`, no `read` (only `readStream`); `catalog` is a 
> method, not a property
> * DataFrame: `where_` not `where`; missing `withColumns`, `hint`, 
> `unpivot`/`melt`, `intersectAll`; `head()` takes no count; `createDataFrame` 
> accepts only a list of column names (no StructType/DDL)
> * Column: `is_null`/`is_not_null`/`get_field` (snake_case) not 
> `isNull`/`isNotNull`/`getField`
> * GroupedData: no `pivot`
> The origin project reached full parity via a skin adapter layer; the fork 
> appears to have lost it. `df.where(...)`, `col.isNull()`, `spark.read`, etc. 
> would break for users.
> h2. Work
> * Restore a faithful drop-in skin (adapter wrappers: where_->where, 
> is_null->isNull, add 
> conf/read/pivot/withColumns/hint/unpivot/intersectAll/head(n)/StructType-createDataFrame,
>  catalog as a property).
> * Add high-level API tests (Rust golden+e2e for the spark-connect API; a 
> drop-in Python exercise, scripts/e2e_wrapper.py, for the pyspark-rs bindings).
> * Raise the rust-coverage CI gate (scripts/rust_coverage.sh, added in 
> SPARK-58987) to 90%.
> UPDATE: delivered together with SPARK-58987 in apache/spark-connect-rust#54 
> (drop-in API fidelity + complete Arrow type mapping + the coverage gate).



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to