装饰后的data_output函数未执行,transform装饰器用法求助
问题分析与解决方案
你的代码无法正常工作的核心原因是对@transform装饰器的用途理解有误:
@transform(通常是Dataiku DSS中的装饰器)的设计目的是将函数封装为数据管道中的配方转换任务,它会自动处理输入输出数据集的连接与执行逻辑。装饰后的函数不再是普通的可直接调用返回DataFrame的函数,而是一个被框架包装后的任务对象。- 你试图将装饰后的函数返回给调用模块并期望它直接返回DataFrame,但这种用法不符合该装饰器的设计逻辑。
解决方案
方案1:直接读取数据集返回DataFrame(无需@transform)
如果你的需求只是读取数据并返回DataFrame给调用模块,完全不需要使用@transform,直接用Dataiku的数据集API即可:
import dataiku def data_read(rid, output_file): # 读取输入数据集为DataFrame input_dataset = dataiku.Dataset(rid) df = input_dataset.get_dataframe() # 可选:将DataFrame写入输出数据集 if output_file: output_dataset = dataiku.Dataset(output_file) output_dataset.write_with_schema(df) return df
方案2:若需保留@transform(集成到数据管道)
如果你必须用@transform定义转换逻辑,同时要在调用模块中获取结果,需要手动执行装饰后的函数逻辑(注意@transform要求函数必须将结果写入输出数据集):
import dataiku from dataiku.customrecipe import transform, Input, Output def data_read(rid, output_file): @transform( output_fi=Output(output_file), src_input=Input(rid) ) def data_output(output_fi, src_input): df = src_input.dataframe() # 必须将结果写入输出数据集,这是@transform的核心要求 output_fi.write_with_schema(df) return df # 手动获取数据集对象并执行转换函数 src_dataset = dataiku.Dataset(rid) output_dataset = dataiku.Dataset(output_file) df = data_output(output_dataset, src_dataset) return df
关键提示
@transform的核心作用是为Dataiku配方生成标准化的转换逻辑,它的设计围绕"读取输入→处理→写入输出"的管道流程,而非直接返回DataFrame给外部调用。- 普通脚本场景下,优先使用
Dataset.get_dataframe()来读取数据,更简洁直接。
内容的提问来源于stack exchange,提问作者Newuser_202126
相关产品推荐
相关产品推荐

