注意:以下翻译的准确性尚未经过验证。这是使用 AIP ↗ 从原始英文文本进行的机器翻译。
以下是一些关于代码工作簿的常见问题。
有关一般信息,请查看我们的代码工作簿文档。
可以。您可以在工作簿之间复制粘贴节点(工作簿图上的元素)。
Ctrl
键,同时选择您要从一个工作簿中复制的节点。不支持复制粘贴Contour面板节点。Cmd+V
(macOS)或Ctrl+V
(Windows)组合键粘贴节点。新节点将被导入到您的新工作簿中。不可以。代码工作簿图上的每个变换节点必须返回一个表格或数据框(例如具有列的二维数据结构)。
Foundry中的工件的原子单位是数据集。每个变换节点需要返回一个表格或数据框(例如具有列的二维数据结构),以便每个节点可以注册为Foundry数据集,从而在Foundry的其余部分中可用。此外,代码工作簿中的表格或数据框必须以有效的模式返回,以便它们能够生成数据集(例如,至少存在一列,列名称不重复,列名称不包含无效字母,等等)。
可以。有关更多信息,请查看有关分支和合并的文档。
代码工作簿的默认配置平均初始化时间为3-5分钟。但是,如果您向代码工作簿配置文件中添加了其他包,初始化时间可能会在20-30分钟之间,具体取决于这些包的复杂性和相互依赖性。随着环境中包的数量增加,初始化时间往往会显著增加。
初始化缓慢通常表明环境定义过大或过于复杂。初始化时间随着环境中包的数量以超线性方式增加,因此您可能需要简化任何自定义环境。在某些情况下,代码工作簿可能会预先初始化常用环境以加快初始化速度。如果您基于默认配置文件创建了自定义环境,较慢的初始化时间可能是由于缺乏预初始化造成的。了解更多关于优化自定义环境初始化时间的信息。
如果浏览器标签页超过30分钟未激活,环境可能会因不活动而丢失。
如果这些变换被构建到数据集中,您可以使用结果数据集预览的比较功能查看当时的代码。从那里您可以复制粘贴相关的变换。不幸的是,如果这段代码位于中间变换中,则无法恢复。
代码工作簿是一个比代码库更具迭代性的平台,后者具有完整的git提交和发布功能。如果您有其他可用的分支,我们建议检查它们是否有被删除的变换。
默认情况下,Conda Forge ↗中可用的任何Python包都可以添加到您的工作簿自定义环境中。如果Python库包含在Conda Forge中,您可以自定义您的环境以直接包含它。
要进行故障排除,请执行以下步骤:
请注意,环境重新加载可能需要一些时间,使用自定义环境通常会比使用标准环境慢,因为标准环境池保持“预热”,而每个自定义环境都是从头开始创建的。
有时可能需要使用代码工作簿中尚不可用的库。可以将这些库添加到您的可用列表中,但这需要一些动手工作。
要进行故障排除,请执行以下步骤:
我正在尝试更新我的工作簿环境,它显示“等待Spark / 初始化环境”一段时间,然后出错,显示“创建环境失败”消息。
要进行故障排除,请执行以下步骤:
本节讨论通常特定于代码工作簿的出错。
有关更多信息,您还可以参考我们关于搭建和检查出错的指南。
运行导入包或任何基本命令返回以下错误:“com.github.rholder.retry.RetryException: 重试在3次尝试后未能成功完成。 在com.github.rholder.retry.Retryer.call(Retryer.java:174)”。在Pandas中使用工作簿时,代码工作簿应用程序将在您的变换之前仍然从Spark数据框转换为Pandas数据框,这会消耗驱动程序上显著更多的内存,并且可能导致OOM。
要进行故障排除,请执行以下步骤:
此问题可能由于多种原因而发生,但最常见的情况是返回的表格或数据框具有有效的模式。如果以下步骤都无法帮助识别您看到的特定错误,请参考我们关于搭建和检查出错的指南。
要进行故障排除,请执行以下步骤:
当选择更新表格预览用于输入表格时,仅更新输入数据集的视图,Foundry中的基础数据集不会自动刷新。
要进行故障排除,请执行以下步骤:
运行 -> 运行所有
。这将运行代码工作簿中的所有变换节点,同时尊重搭建依赖关系。当您发现无法将分支合并回主分支时,最常见的问题是master
分支受到保护。可能存在合并冲突问题,但这将在其他部分中进行介绍。
要进行故障排除,请执行以下步骤:
master
上启用分支保护,并确保您想要限制合并分支的用户只有工作簿的compass:edit
权限。view
、edit
、maintain
和manage
。默认情况下,compass:read
扩展为view
,compass:edit
扩展为edit
,compass:manage
扩展为maintain
和manage
。edit
权限。合并到受保护的分支需要maintain
权限。更改分支保护设置需要manage
权限。master
分支代码冲突的非附加代码。
master
。master
分支未受保护,且没有合并冲突,仍然无法将分支合并到master
,请联系Palantir客服支持。假设我有数据集输入(1000行30列)+(100万行30列),并且有许多窗口/列推导步骤的变换,我如何加快计算速度?
要进行故障排除,请执行以下步骤:
对于实验或快速迭代,通常是个好主意将代码重构为几个较小的步骤,而不是一个大的步骤。
这样,您可以先计算上游单元格,将数据写回Foundry,并在后续步骤中使用此预计算的数据。如果您要在不更改这些早期步骤的逻辑的情况下重新计算,这会产生过多的工作。
具体来说:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
workbook_1: cell_A: work_1 : input -> df_1 # 需要进行4次迭代才能正确 (takes 4 iterations to get right): 4 * df_1 work_2: df_1 -> df_2 # 需要进行4次迭代才能正确 (takes 4 iterations to get right): 4 * df_2 + 4 * df_1 = 4 df_2 + 4 df_1 work_3: df_2 -> df_3 # 需要进行4次迭代才能正确 (takes 4 iterations to get right): 4 * df_3 + 4 * df_2 + 4 * df_1 total work: cell_A = work_1 + work_2 + work_3 = 4 * df_1 + (4 * df_2 + 4 * df_1) + (4 * df_3 + 4 * df_2 + 4 * df_1) = 12 * df_1 + 8 * df_2 + 4 * df_3
该代码段描述了一个工作簿中单元A的操作过程,其中涉及三个主要工作步骤(work_1
、work_2
、work_3
),每个步骤都需要进行4次迭代才能达到正确结果。最后计算出单元A的总工作量。
相反,如果您将work_1和work_2分别写入它们自己的单元格,您执行的工作将看起来像:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
workbook_2: cell_A: work_1: input -> df_1 (takes 4 iterations to get right): 4 * df_1 # 需要4次迭代才能正确:4 * df_1 cell_B: work_2: df_1 -> df_2 (takes 4 iterations to get right): 4 * df_2 # 需要4次迭代才能正确:4 * df_2 cell_C: work:3: df_2 -> df_3 (takes 4 iterations to get right): 4 * df_3 # 需要4次迭代才能正确:4 * df_3 total_work: cell_A + cell_B + cell_C = work_1 + work_2 + work_3 = 4 * df_1 + 4 * df_2 + 4 * df_3 # 总工作量等于cell_A、cell_B和cell_C的工作量之和 # = work_1 + work_2 + work_3 # = 4 * df_1 + 4 * df_2 + 4 * df_3
如果假设 df_1、df_2 和 df_3 的计算成本相同,workbook_1.total_work = 24 * df_1
,而 workbook_2.total_work = 12 * df_1
,因此可以预期迭代速度提高接近2倍。
对于任何“小”数据集,您应该通过选择工作簿并选择操作 > 缓存来缓存它们。
这将使工作簿中的行保留在内存中,而不需要从写回的数据集中获取。根据需要考虑的几个因素,“小”是一个任意的判断,但 Code Workbook 在尝试缓存时做得很好,并会在太大时发出警告。
您应尽可能使用原生的 PySpark 方法,切勿直接在数据上使用 Python 方法(例如循环遍历单个行,执行 UDF)。PySpark 方法调用的是用 Scala 编写的底层 Spark 方法,并直接针对数据运行,而不是针对 Python 运行时;如果您只是使用 Python 作为与该系统交互的层,而不是作为与数据交互的系统本身,您将获得 Spark 本身的所有性能优势。
如果您能够从大型输入数据集中得出自己的准确样本,则可以将其用作变换的模拟输入,直到完善逻辑并希望针对完整数据集进行测试。
在编写 PySpark 代码之前,考虑对超过一百万行的数据集进行降采样和缓存;由于数据集大小较大,您可能会在不慢慢捕获语法错误的情况下体验到更快的周转时间。
一个好的代码工作簿看起来如下: