Tim Meehan created SPARK-61289:
----------------------------------

             Summary: Raise NOT_EXPECTED_TYPE for an argument of a higher-order 
function that is not a Column or a column name, in the Python client as PySpark 
does
                 Key: SPARK-61289
                 URL: https://issues.apache.org/jira/browse/SPARK-61289
             Project: Spark
          Issue Type: Bug
          Components: Connect
    Affects Versions: connect-rust-4.3.0
            Reporter: Tim Meehan


PySpark's higher-order functions take each column argument as a Column or a 
column name, and raise NOT_EXPECTED_TYPE for anything else. In the Python 
client of spark-connect-rust, they send a Python list or another value on as a 
literal.

{code:python}
from pyspark.sql import SparkSession, functions as F

spark = SparkSession.builder.remote("sc://localhost:15002").getOrCreate()
spark.range(1).select(F.transform([1, 2, 3], lambda x: x * 
10).alias("t")).collect()
{code}

Against an OSS Spark 4.3.0 Connect server on loopback:
* pyspark-client 4.3.0: PySparkTypeError: \[NOT_EXPECTED_TYPE\] Argument `col` 
should be Column or str, got list.
* spark-connect-rust master 8768cc4: \[Row(t=\[10, 20, 30\])\]. F.exists(\[1, 
2\], lambda x: x > 1) likewise returns \[Row(e=True)\].

So code written against the Python client can fail on PySpark. From source: 
_invoke_higher_order_function (python/pyspark/sql/functions.py:551) converts 
its columns with the _to_col at line 58, which returns anything but a str 
unchanged; the _to_col of python/pyspark/sql/functions_generated.py (line 27) 
raises, as PySpark's does. aggregate, array_sort, exists, filter, forall, 
map_filter, map_zip_with, reduce, transform, transform_keys, transform_values 
and zip_with all go through it.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

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

Reply via email to