由于阶段失败,Pyspark 作业中止错误

Posted

技术标签:

【中文标题】由于阶段失败,Pyspark 作业中止错误【英文标题】:Pyspark job aborted error due to stage failure 【发布时间】:2021-01-11 17:01:12 【问题描述】:

我有以下代码:

# fact table
df = (spark.table(f'nn_squad7_country.fact_table')
     .filter(f.col('date_key').between(start_date,end_date))
     #.filter(f.col('is_lidl_plus')==1)
     .filter(f.col('source')=='tickets')
     .filter(f.col('subtype')=='trx')
     .filter(f.col('is_trx_ok') == 1)
     .join(dim_stores,'store_id','inner')
     .join(dim_customers,'customer_id','inner')
     .withColumn('week', f.expr('DATE_FORMAT(DATE_SUB(date_key, 1), "Y-ww")'))
     .withColumn('quarter', f.expr('DATE_FORMAT(DATE_SUB(date_key, 1), "Q")')))


#checking metrics
df2 =(df
      .groupby('is_client_plus','quarter')
      .agg(
        f.countDistinct('store_id'),
        f.sum('customer_id'),
        f.sum('ticket_id')))

display(df2)

当我执行查询时,我收到以下错误:

SparkException:作业因阶段失败而中止:阶段 13.0 中的任务 58 失败 4 次,最近一次失败:阶段 13.0 中丢失任务 58.3(TID 488、10.32.14.43、执行程序 4):java.lang.IllegalArgumentException:非法模式字符'Q'

我不确定为什么会收到此错误,因为当我单独运行事实表块时,我没有收到任何错误。

有什么建议吗?谢谢!

【问题讨论】:

不知道为什么会这样,但请尝试使用quarter(DATE_SUB(date_key, 1)) 而不是DATE_FORMAT(DATE_SUB(date_key, 1), "Q") 【参考方案1】:

根据 Spark 3 的 docs,“Q”是有效的日期时间格式模式,尽管它不是有效的 Java 时间格式。不知道为什么它对您不起作用 - 可能是 Spark 版本问题。尝试改用函数quarter,它应该给出相同的预期输出:

df = (spark.table(f'nn_squad7_country.fact_table')
     .filter(f.col('date_key').between(start_date,end_date))
     #.filter(f.col('is_lidl_plus')==1)
     .filter(f.col('source')=='tickets')
     .filter(f.col('subtype')=='trx')
     .filter(f.col('is_trx_ok') == 1)
     .join(dim_stores,'store_id','inner')
     .join(dim_customers,'customer_id','inner')
     .withColumn('week', f.expr('DATE_FORMAT(DATE_SUB(date_key, 1), "Y-ww")'))
     .withColumn('quarter', f.expr('quarter(DATE_SUB(date_key, 1))')))

【讨论】:

【参考方案2】:

如果您查看函数的documentation,它会明确说明可以使用哪些模式字母:

All pattern letters of the Java class java.text.SimpleDateFormat can be used.

您可以在此处查看有效模式:

https://docs.oracle.com/javase/10/docs/api/java/text/SimpleDateFormat.html

看起来Q 不是其中之一。根据 cmets @mck 显示了一个合适的替代方案。

【讨论】:

以上是关于由于阶段失败,Pyspark 作业中止错误的主要内容,如果未能解决你的问题,请参考以下文章

火花作业中的 Azure databricks 群集错误:ExecutorLostFailure

Spark *** 上的 Hive 错误

Spark 错误 - 退出状态:143。诊断:容器应请求终止

MPI_Irecv 中的致命错误:正在中止作业

加载多个文件并且缺少一个文件时,PySpark 作业失败 [重复]

Sparklyr - 小数精度 8 超过最大精度 7