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

Szehon Ho resolved SPARK-60486.
-------------------------------
    Fix Version/s: 4.4.0
       Resolution: Fixed

Issue resolved by pull request 59732
[https://github.com/apache/spark/pull/59732]

> DSv2 file source silently drops a Python UDF filter on a partition column
> -------------------------------------------------------------------------
>
>                 Key: SPARK-60486
>                 URL: https://issues.apache.org/jira/browse/SPARK-60486
>             Project: Spark
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 4.0.0, 3.5.8, 4.2.0, 4.1.1
>            Reporter: Yaoxuan Wu
>            Assignee: Yaoxuan Wu
>            Priority: Major
>              Labels: correctness, pull-request-available
>             Fix For: 4.4.0
>
>
> {code:python}
> from pyspark.sql import functions as F
> from pyspark.sql.types import BooleanType
> spark.conf.set("spark.sql.sources.useV1SourceList", "")   # DSv2 file source
> spark.range(5).selectExpr("id AS v", "CAST(id AS INT) AS p") \
>     .write.mode("overwrite").partitionBy("p").parquet("/tmp/udf_part")
> gt2 = F.udf(lambda x: x is not None and x > 2, BooleanType())
> spark.read.parquet("/tmp/udf_part").filter(gt2("p")).collect()
> # expected: v in [3, 4]
> # actual:   v in [0, 1, 2, 3, 4]
> {code}
> The filter is in the analyzed plan but gone from the optimized plan, which is 
> just the {{RelationV2}} scan ({{PartitionFilters: []}}, no 
> {{BatchEvalPython}}). The same with ORC and with Arrow UDFs. Correct with the 
> DSv1 file source, with a built-in predicate {{p > 2}}, and with a UDF on a 
> data column.
> Cause: {{FileScanBuilder.pushFilters}} treats a filter that references only 
> partition columns as handled by partition pruning and does not return it as a 
> post-scan filter. Since SPARK-48666 (3.5.2), a partition filter containing a 
> {{PythonUDF}} is kept out of {{partitionFilters}} (the file index cannot 
> evaluate it), but it is not returned as a post-scan filter either, so 
> {{V2ScanRelationPushDown}} removes the Filter and nothing evaluates it. 
> Returning those filters as post-scan filters would fix it.
> Reproduces on 3.5.8, 4.0.0, 4.1.1 and 4.2.0 (3.5.1 and earlier fail with 
> INTERNAL_ERROR instead, which SPARK-48666 fixed).



--
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