首页 > 解决方案 > 由于阶段失败,Pyspark 作业中止错误

问题描述

我有以下代码:

# 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:非法模式字符'问'

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

有什么建议吗?谢谢!

标签: pythondataframeapache-sparkpysparkapache-spark-sql

解决方案


根据 Spark 3 的文档,'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))')))

推荐阅读