Spark SQL错误无法评估表达式,在2.3.2中工作,在2.4中失败

时间:2019-01-30 05:54:37

标签: apache-spark

我刚刚发布了一个问题,希望我不要过分遵守协议!

https://issues.apache.org/jira/browse/SPARK-26777

我想知道是否有人遇到过SQL Spark 2.4.0(来自Pyspark 3.6)的问题

spark.sql("select partition_year_utc,partition_month_utc,partition_day_utc \
    from datalake_reporting.copy_of_leads_notification \
    where partition_year_utc = (select max(partition_year_utc) from datalake_reporting.copy_of_leads_notification) \
    and partition_month_utc = \
    (select max(partition_month_utc) from datalake_reporting.copy_of_leads_notification as m \
    where \
    m.partition_year_utc = (select max(partition_year_utc) from datalake_reporting.copy_of_leads_notification)) \
    and partition_day_utc = (select max(d.partition_day_utc) from datalake_reporting.copy_of_leads_notification as d \
    where d.partition_month_utc = \
    (select max(m1.partition_month_utc) from datalake_reporting.copy_of_leads_notification as m1 \
    where m1.partition_year_utc = \
    (select max(y.partition_year_utc) from datalake_reporting.copy_of_leads_notification as y) \
    ) \
    ) \
    order by 1 desc, 2 desc, 3 desc limit 1 ").show(1,False)

PySpark / SQL以上代码可在Presto / Athena中使用,并且以前也可在Spark 2.3.2中使用。

现在,在最新的 Spark 2.4.0 AWS EMR 5.20.0 中,它失败,并出现错误(查询语法):

  

py4j.protocol.Py4JJavaError:调用时发生错误   o1326.showString。 :java.lang.UnsupportedOperationException:无法   评估表达式:scalar-subquery#4495 []

我在Spark中提交了一个问题,但我也想知道是否有人已经知道它了?

我可以重新编写此SQL代码,以将其分解为多个(3-4)个简单的SQL语句,但是由于它相当琐碎,因此考虑将其发布在此处以征求意见。 谢谢!

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,暂时恢复为EMR 5.17,但做一些阅读和好奇的是子查询别名可能是原因。

“未混淆的子查询的语义尚未用混乱的行为很好地定义。从Spark 2.3开始,我们使这种混乱的情况无效,例如:SELECT vi from(SELECT i FROM v),Spark在这种情况下将引发分析异常因为用户不应在子查询中使用限定符。有关更多详细信息,请参见SPARK-20690和SPARK-21335。“

https://spark.apache.org/docs/2.4.0/sql-migration-guide-upgrade.html

您在查询和子查询中使用datalake_reporting.copy_of_leads_notification,也许您需要使用别名?