Prefect运行RunGreatExpectationsValidation任务抛出异常问题求助
问题原因
Prefect 0.15.9版本内置的RunGreatExpectationsValidation任务适配的是GE 0.12.9及更早版本的逻辑,任务内部默认GE的get_checkpoint方法返回可下标访问的字典类型。从GE 0.12.10版本开始,Checkpoint重构为类对象,不管是V3的Checkpoint还是V2的LegacyCheckpoint都不再支持[]方式读取属性,你尝试过的GE 0.12.10、0.13.43都属于该版本区间,所以会触发TypeError: 'Checkpoint' object is not subscriptable报错。你本地直接执行GE命令正常是因为GE本身的CLI适配了新对象结构,只有Prefect的旧版本任务逻辑不兼容。
解决方案
方案1:升级Prefect版本(推荐)
Prefect从0.15.10版本开始修复了GE兼容性问题,你可以直接将Prefect升级到0.15.10及以上的0.x版本,无需修改业务代码即可解决问题:
pip install prefect>=0.15.10
注意不要直接升级到Prefect 2.x,2.x的流任务API和1.x不兼容,需要调整整体流代码结构。
方案2:降级GE版本
如果你不能升级Prefect版本,可以将GE降级到0.12.9及之前的版本,该版本区间的Checkpoint返回格式为字典,适配Prefect 0.15.9的内置任务:
pip install great-expectations==0.12.9
方案3:自定义重写任务逻辑
如果项目必须固定使用Prefect 0.15.9和GE 0.12.10及以上版本,可以自定义重写任务逻辑,适配新的Checkpoint对象结构,示例代码如下:
from prefect.tasks.great_expectations import RunGreatExpectationsValidation class CustomRunGEValidation(RunGreatExpectationsValidation): def run(self, **kwargs): ge_context = self._get_context(**kwargs) ge_checkpoint = ge_context.get_checkpoint(name=kwargs.get("checkpoint_name")) # 直接调用Checkpoint对象的run方法,跳过原任务不兼容的下标读取逻辑 checkpoint_run_result = ge_checkpoint.run() # 沿用原任务的结果校验逻辑 self._check_validation_run_result(checkpoint_run_result) return checkpoint_run_result # 用自定义任务替换原官方任务即可,流代码其他部分无需调整 validation_task = CustomRunGEValidation()
内容的提问来源于stack exchange,提问作者vBob
相关产品推荐
相关产品推荐

