如何在Palantir Foundry中将Compass文件夹内PDF复制到数据集文件系统
在Palantir Foundry中从Compass复制PDF到非结构化数据集的实现方案
可以在Transform中完成这个操作,无需依赖代码库导入,以下是具体实现步骤和代码示例:
1. 利用已配置的Compass File Lister获取文件元数据
你已配置的Compass File Lister会输出一个结构化数据集,每一行对应一个Compass中的PDF文件,包含核心字段:
rid:Compass文件的唯一标识符name:文件原始名称- 可选元数据(如文件大小、创建时间等)
将这个数据集作为Transform的输入源。
2. 在Python Transform中实现文件复制
使用Foundry Python SDK提供的compass和datasets模块,直接读取Compass文件的字节流并写入目标非结构化数据集——不要用shutil操作本地文件路径,因为Compass文件存储在Blobster分布式存储中,并非本地文件系统。
完整代码示例
from transforms.api import transform, Input, Output from foundry import compass, datasets import shutil @transform( # 替换为你的Compass File Lister输出数据集路径 input_compass_files=Input("/your/path/to/compass-file-lister-output"), # 替换为你的目标非结构化数据集路径 output_unstructured=Output("/your/path/to/target-unstructured-dataset") ) def copy_compass_pdfs_to_dataset(input_compass_files, output_unstructured): # 将输入数据集转换为Pandas DataFrame以便遍历 file_records = input_compass_files.dataframe().toPandas() for _, file_info in file_records.iterrows(): file_rid = file_info["rid"] file_name = file_info["name"] try: # 通过Compass RID获取文件对象并打开二进制读取流 with compass.get_file(file_rid).open("rb") as source_stream: # 在目标非结构化数据集中创建文件并打开二进制写入流 with output_unstructured.filesystem().open(file_name, "wb") as target_stream: # 分块复制文件内容(适合大文件,避免内存溢出) shutil.copyfileobj(source_stream, target_stream) print(f"成功复制文件: {file_name}") except Exception as e: print(f"复制文件 {file_name} 失败: {str(e)}")
关键说明
- 权限要求:确保Transform的运行身份拥有:
- Compass文件夹及文件的读取权限
- 目标非结构化数据集的写入权限
- 大文件优化:使用
shutil.copyfileobj分块读写,避免一次性加载大文件到内存,提升稳定性和性能 - 关于官方文档:你查阅的「read files in a repository」针对的是代码库(Code Repositories),确实不适用于Compass文档存储,无需参考;Compass原生API仅支持内部文件夹操作,但通过Transform SDK可以实现跨存储层的字节流复制。
内容的提问来源于stack exchange,提问作者tessa
相关产品推荐
相关产品推荐

