You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@spark.apache.org by "Wenchen Fan (JIRA)" <ji...@apache.org> on 2018/07/03 04:31:00 UTC

[jira] [Updated] (SPARK-24385) Trivially-true EqualNullSafe should be handled like EqualTo in Dataset.join

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

Wenchen Fan updated SPARK-24385:
--------------------------------
    Fix Version/s: 2.3.2

> Trivially-true EqualNullSafe should be handled like EqualTo in Dataset.join
> ---------------------------------------------------------------------------
>
>                 Key: SPARK-24385
>                 URL: https://issues.apache.org/jira/browse/SPARK-24385
>             Project: Spark
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 2.2.1, 2.3.0
>            Reporter: Daniel Shields
>            Assignee: Marco Gaido
>            Priority: Major
>             Fix For: 2.3.2, 2.4.0
>
>
> Dataset.join(right: Dataset[_], joinExprs: Column, joinType: String) has special logic for resolving trivially-true predicates to both sides. It currently handles regular equals but not null-safe equals; the code should be updated to also handle null-safe equals.
> Pyspark example:
> {code:java}
> df = spark.range(10)
> df.join(df, 'id').collect() # This works.
> df.join(df, df['id'] == df['id']).collect() # This works.
> df.join(df, df['id'].eqNullSafe(df['id'])).collect() # This fails!!!
> # This is a workaround that works.
> df2 = df.withColumn('id', F.col('id'))
> df.join(df2, df['id'].eqNullSafe(df2['id'])).collect(){code}
> The relevant code in Dataset.join should look like this:
> {code:java}
> // Otherwise, find the trivially true predicates and automatically resolves them to both sides.
> // By the time we get here, since we have already run analysis, all attributes should've been
> // resolved and become AttributeReference.
> val cond = plan.condition.map { _.transform {
>   case catalyst.expressions.EqualTo(a: AttributeReference, b: AttributeReference) if a.sameRef(b) =>
>     catalyst.expressions.EqualTo(
>       withPlan(plan.left).resolve(a.name),
>       withPlan(plan.right).resolve(b.name))
>   // This case is new!!!
>   case catalyst.expressions.EqualNullSafe(a: AttributeReference, b: AttributeReference) if a.sameRef(b) =>
>     catalyst.expressions.EqualNullSafe(
>       withPlan(plan.left).resolve(a.name),
>       withPlan(plan.right).resolve(b.name))
> }}
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@spark.apache.org
For additional commands, e-mail: issues-help@spark.apache.org