分析代码工作簿Transforms概述

注意:以下翻译的准确性尚未经过验证。这是使用 AIP ↗ 从原始英文文本进行的机器翻译。

概述

变换是指将一个或多个输入进行处理并返回单一输出的逻辑片段。输入和输出可以是Foundry数据集或模型。

Code Workbook目前支持三种类型的变换:

  • 代码变换允许用户使用自己选择的语言编写任意逻辑。
  • 模板变换将代码抽象为一个简单的基于表单的界面,可以在不同的工作簿和用户之间复用。
  • 手动输入变换允许用户将数据输入到节点中。

添加变换

在Code Workbook中有几种方法可以添加新的变换。

使用图表左上角的新建变换按钮,选择要添加的变换类型。例如,选择Python代码以添加新的Python代码节点,或选择模板以打开模板浏览器。

transforms-new-transform-button

或者,将鼠标悬停在图表上的现有变换上,然后点击出现的蓝色**+**按钮以打开选择下拉菜单。新创建的变换将成为所选变换的子节点。

transforms-plus-button

编辑变换

编辑名称

Code Workbook中的变换可以保存为数据集。阅读更多关于数据持久化的信息。

未保存为数据集的变换通过特定于工作簿的别名进行识别,允许您在代码中引用变换。对于输入数据集和保存为数据集的变换,Code Workbook会显示每个数据集的两个不同名称:基础Foundry数据集的名称和特定于工作簿的别名。

transforms-names

别名有以下几个好处:

  • 您可以以一种对工作簿逻辑直观的方式引用数据集。例如,如果您在不同文件夹中有两个名为“Titanic”的数据集,分别对应不同的更新频率,您可以将其中一个别名为titanic_historical,另一个别名为titanic_daily_feed
  • 您可以自由编辑数据集的别名,而无需更改任何在Foundry中使用相同数据集的人的数据集名称。
  • 您可以在分支上更改数据集的别名,并将该更改合并到其他分支。

要编辑数据集名称或其别名,请点击逻辑面板中的名称,输入新名称,并在完成编辑后使用Enter键。如果您更改数据集名称或别名,系统会提示您是否希望自动更新另一个名称。

添加输入

点击任何变换以打开逻辑面板。要添加输入,点击顶输入栏中的**+**按钮,然后点击所需的输入。

transforms-add-input

要添加多个输入,请使用**+**旁边的按钮。

代码

代码变换显示为一个代码编辑器,预先填充了您在当前工作簿中使用的语言的基本结构。有关在每种语言中编写代码的具体细节,请参阅语言文档

全局代码

全局代码窗格允许您定义在工作簿中的每个代码变换之前执行的代码。全局代码窗格可用于定义将在工作簿中的变换中可用的变量和函数。

模板

对于模板变换,逻辑面板显示一个表单以编辑模板参数。

  • 点击数据集参数后,点击图表中的任何数据集以将其设置为该参数的值。
  • 列参数依赖于指定的输入数据集。指定后,您可以从列名的下拉列表中选择。
  • 对于整数和字符串等值参数,您可以输入自定义值。

手动输入

通过点击图表中的手动输入按钮添加一个手动输入节点。

manual-entry-button

手动输入选项卡中输入数据。目前支持的列类型有双精度、整数、布尔和字符串。仅支持500行。

复制和粘贴可以轻松地从其他地方导入数据。

manual-entry-node

运行变换

在底部面板中选择运行以执行所选的变换。要运行所有下游变换,选择箭头图标并选择运行所有下游

运行变换需要对工作簿的编辑权限,以及对工作簿中使用的任何数据集使用的所有权限标记的访问权限。

还有一些快捷键可以快速运行代码。输入?以查看快捷键列表。

有两种方法可以一次运行多个变换:

  • 使用Ctrl + 点击或Cmd + 点击在图表中选择多个数据集。然后右键点击图表中的任意位置,从菜单中选择运行N个数据集
  • 点击顶部栏中的设置图标 (Gear icon),选择运行所有变换

当变换正在运行时,任何打印的输出都会流式传输到日志选项卡。这允许您在变换过程中打印输出并在变换仍在运行时查看结果,这对调试或计时逻辑非常有用。

一旦保存到数据集,代码中应用的任何数据排序可能不会被持久化。换句话说,如果您运行一个对数据进行排序的变换,当您将其视为数据集时,数据可能不会按该顺序排序,尽管变换中的其他操作已经应用。

选项卡

在图表或全屏编辑器中工作时,使用节点底部的选项卡导航变换的输入和输出。

输入

使用输入选项卡查看变换的输入,添加其他输入或更改输入类型。

警告

与其他基于Spark的应用程序一样,Code Workbook在读取数据集时默认不维持行顺序。如果您的分析需要特定的行顺序,请在代码中对数据进行排序。

changing_input_type

每种节点语言可用的输入类型如下:

节点语言可用的输入类型
PythonSpark dataframe, Pandas dataframe, Python transform input, Object
SQLSpark dataframe
RSpark dataframe, R transform input, R data.frame, Object

当添加新的变换时,其输入变换将根据新变换的语言和每个输入变换类型默认设置为输入类型,如下所示:

输入变换类型下游变换语言默认输入类型附加细节
无架构导入PythonPython transform input
RR transform input
SQLSpark dataframe虽然您可以创建一个没有架构的输入变换的SQL节点,但SQL节点仅支持Spark dataframe输入,并且在分析没有架构的输入时不会有效。
有架构导入PythonSpark dataframe
RR data.frame
SQLSpark dataframe
自定义文件格式导入,包括模型PythonObject有关更多信息,请参阅模型训练教程。Code Workbook中的Object输入类型是自定义文件格式,与Ontology对象无关。
RObject有关更多信息,请参阅模型训练教程。Code Workbook中的Object输入类型是自定义文件格式,与Ontology对象无关。
SQLSpark dataframe虽然您可以创建一个自定义文件格式输入变换的SQL节点,但SQL节点仅支持Spark dataframe输入,并且在分析自定义文件格式输入时不会有效。
派生节点N/A输入节点的输出类型如果输入节点的输出类型与派生节点的语言不兼容,派生节点将使用上面定义的默认值。例如,如果节点A返回Pandas dataframe,而派生节点B是R节点,则节点B将默认读取节点A为R data.frame。

预览

当您在Code Workbook中运行变换时,将计算50行的预览以查看结果的形状。此预览显示在预览选项卡中,数据集写入Foundry完成之前。在数据集持久化到Foundry之后,预览选项卡将更新为完整结果。

可视化

根据变换中使用的语言,您可以使用绘图库返回会传播到Code Workbook用户界面的可视化。有关如何在每种语言中执行此操作的详细信息,请参阅语言文档

生成的可视化内容将默认显示在图表中,也可以在底部的可视化选项卡中查看。

transforms-visualization

使用上下文菜单,您可以在表格模式和图表模式之间切换视图。

toggle_transformation

在可视化选项卡中,您可以将图表下载为图像或将其添加到报告中。这些操作也可以在上下文菜单中进行。

visualization_tab

日志

查看运行变换时的打印语句(标准输出)、警告和出错(标准出错)。如果存在标准出错,日志选项卡将自动选中,并会出现一个小的提示,通知您有警告/出错输出。

logs_tab

描述

更新数据集的描述。请注意,更新描述会在所有分支中更新 - 该描述也将在打开数据集视图中可用。

您可以使用markdown来样式化您的描述,并通过在右键(操作)菜单中启用显示描述在图表中查看它们。要在一个工作簿中的所有节点上显示描述,请点击标题中的工具齿轮图标并选择显示所有描述

模型

返回模型的变换将自动写入Foundry作为模型,从而允许使用Foundry ML界面。有关如何在每种语言中使用模型的详细信息,请参阅语言文档

非确定性变换

一些变换是非确定性的——尽管输入数据和变换逻辑相同,它们返回的结果却不同。一些可能导致非确定性变换的函数包括调用当前时间戳、行号、单调递增的ID以及在对包含重复值的列排序后的变换。

在Code Workbook中,运行一个变换将启动两个任务:一个任务计算50行预览,另一个任务对整个数据集进行变换并将结果写入Foundry。如果存在非确定性变换,您在50行预览中看到的结果可能与Foundry数据集中的结果不一致。

在变换中运行非确定性代码时,数据框不一定会物化。例如,假设您有一个非确定性变换Transform A,它是Transforms B和C的父变换。如果您分别从Code Workbook中运行每个变换,则每个数据集将顺序写入Foundry,从而在变换B和C中保持一致的结果。然而,如果您选择“运行所有下游”在A上,由于在运行B和C时A不一定物化,您可能会看到冲突的结果。从数据沿袭中运行构建也可以防止这种情况,因为每个数据集将被物化并顺序计算,就像转换为Pandas dataframe一样。

一些导致非确定性变换的函数示例包括current_date()current_timestamp()row_count(),尽管其他函数也可能导致非确定性。有关Spark计算变换可能导致意外行为的更多信息,请参阅Apache Spark文档 ↗