Palantir Foundry中transform与transform_df的区别及拆分必要性
Palantir Foundry中
transform与transform_df的差异 - 输入输出处理逻辑不同
transform是通用型装饰器,支持传入任意类型的Foundry数据集对象(结构化表、非结构化文件、半结构化数据等),你需要手动调用方法将输入转成需要的格式(比如dataframe()方法转Spark DataFrame),处理完成后也要手动调用输出对象的写方法完成数据写入。transform_df是专为Spark DataFrame处理场景优化的装饰器,会自动将所有输入数据集转成Spark DataFrame传入处理函数,你只需要返回处理完成的DataFrame,框架会自动完成数据写入,不需要手动处理读写逻辑。 - 适用场景不同
transform适用于所有数据处理场景,尤其适合非结构化数据处理、混合类型数据源处理、需要自定义读写逻辑的场景(比如指定读写分区、筛选读取列、自定义序列化规则等)。transform_df仅适用于输入输出均为结构化表、全程使用Spark DataFrame做计算的场景。 - 代码简洁度不同
同样实现简单的DataFrame过滤逻辑,两种写法的对比如下:
使用transform的代码:
使用from transforms.api import transform, Input, Output @transform( output=Output("/datasets/processed/filtered_data"), raw_data=Input("/datasets/raw/source_data") ) def compute(raw_data, output): # 手动读取为DataFrame source_df = raw_data.dataframe() # 业务逻辑 filtered_df = source_df.filter(source_df.amount > 1000) # 手动写入输出 output.write_dataframe(filtered_df)transform_df的代码:from transforms.api import transform_df, Input, Output @transform_df( Output("/datasets/processed/filtered_data"), raw_data=Input("/datasets/raw/source_data") ) def compute(source_df): # 直接处理输入的DataFrame,直接返回结果即可 return source_df.filter(source_df.amount > 1000) - 底层实现无差异
transform_df本质是基于transform封装的语法糖,底层运行、资源调度逻辑完全一致,两者没有性能上的区别。
分别设置两个方法的原因
- 兼顾通用性和易用性
Foundry作为全场景数据开发平台,需要支持结构化、半结构化、非结构化等所有类型的数据处理需求,transform提供了最高的灵活度,可以覆盖所有场景;而结构化DataFrame处理是用户使用频率最高的场景,transform_df可以减少大量样板代码,降低入门门槛,提升日常开发效率。 - 适配不同用户的开发习惯
对于资深开发人员,很多场景下需要自定义读写逻辑做性能优化、调试、权限管控,transform的显式读写逻辑更符合这类需求;对于只需要做结构化数据处理的分析人员、业务开发人员,不需要关心底层读写实现,transform_df可以让他们只专注于业务逻辑本身。 - 平滑的学习路径设计
新用户可以从简单的transform_df入手快速上手开发,不需要一开始就掌握所有Foundry数据集的读写API,熟悉之后再根据场景需求切换到transform做更复杂的开发。
内容的提问来源于stack exchange,提问作者sumitkanoje
相关产品推荐
相关产品推荐

