python - 由于阶段失败,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:非法模式字符'问'
我不确定为什么会收到此错误,因为当我单独运行事实表块时,我没有收到任何错误。
有什么建议吗?谢谢!
解决方案
根据 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))')))
推荐阅读
- python - 查找列表中出现的数字
- java - 如何创建 org.reactivestreams.Publisher
来自 java.io.InputStream? - docusignapi - 没有数字选项卡的 Docusign 支付网关
- spring-boot - Spring Security & Keycloak:保持登录状态
- python - Numpy数组连接:ValueError:连接轴的所有输入数组维度必须完全匹配
- spring-boot - 是否可以在 SpringBoot 中注册控制器特定的 ObjectMapper
- javascript - 使用 wavesurfer-js 在一页中显示多个波形
- c - protobuf-c 在 Cygwin 上构建
- sql - 性能问题 Where 子句
- findstr - Windows:查找字符串下一行