Snowflake 高级设置

Version 23.4.8843


Snowflake 高级设置


Snowflake 端口的 高级设置 选项卡允许配置端口的高级属性及其数据处理方法。以下部分详细介绍了以下功能和配置:

高级选项卡上的许多其他设置都是从正在使用的数据源动态加载的,因此本文档中未介绍它们。 高级选项卡 中描述了非特定于数据源的设置。

提示:可以突出显示应用程序中的任何字段以显示工具提示,其中包含有关该字段功能的更多信息。

XML 模型

Snowflake 端口将知行之桥中的 Snowflake 表建模为 XML。建模遵循以下结构:

  • 父元素标识要插入的表。
  • 每个子元素对应目标表中的一列。

这在 XML 元素和 Snowflake 值之间建立了连接,这允许端口从传入的 XML 文档中读取值并在 INSERT 或 UPDATE 查询中使用它们。

单击配置面板上方的 </> 代码 可以查看表的 XML 模型。以下 XML 是名为 Account 的表的简化示例模型:

<Items>
    <Account action="upsert">
        <Id key="true" />
        <account_c />
        <AccountNumber />
        <AccountSource />
    </Account>
</Items>

在上面的例子中,Idaccount_cAccountNumberAccountSource是Account表的列。当端口处理与此结构匹配的 XML 文件时,它会自动将来自该 XML 的值插入到 Account 表中。当端口查询 Account 表时,它会输出与此结构匹配的 XML。

批处理输入

Snowflake 端口支持批处理以提高插入大量数据时的性能。批处理通过 高级设置 部分下标记为 事务大小批处理大小 的两个字段进行配置。当这些字段设置为正整数时,端口在单个操作(批处理)中插入 [批处理大小] 记录,并在单个连接(事务)中插入 [事务大小] 记录。

XML 输入文件可以包含比单个事务大小更多的记录,在这种情况下,端口将在多个事务中插入数据

如果在批量插入过程中发生错误,端口将回滚事务并缓存失败事务中第一条记录的索引。重试输入文件时,只有缓存索引之后的记录才会插入到Snowflake中。

批量输出

当查询输出时,端口可以配置为支持将记录一起批量输出到单个文档中。 最大记录数 设置可用于控制单个消息中应包含多少条记录,批处理大小 设置可用于指示单个批处理组中应包含多少个批处理消息。

子表

Snowflake 端口支持使用单个操作更新和选择多个表。创建具有多个表的表模型时,这些表之间应该有外键关系,表示一个表是另一个表的子表。

要与子表交互,首先创建一个以父表为目标的模型。然后使用 +添加 按钮从配置面板中添加子表。从表列表中选择子表,设计器将自动填充表的层次结构,然后选择应包含在模型中的子表的列。

子表 XML

插入父表和子表时,输入映射 XML 结构将是多层的。以下 XML 是通过外键关联的两个表的示例输入映射:

<Account action="upsert">
    <Id key="true" />
    <account_c />
    <AccountNumber />
    <AccountSource />
    <AccountPartner>
        <Id key="true" />
        <AccountFromId ref="@Id" />
        <IsPrimary />
        <OpportunityId />
        <Role />
    </AccountPartner>
</Account>

在上面的例子中,Account 是父表,AccountPartner 是子表。当 Snowflake 端口处理匹配此结构的输入 XML 文件时,它会更新 AccountAccountPartner 表并确保链接两条记录的键相同。

REF

子表中的某些列标有蓝色 REF 标记。此标记表示这些列对应于父表中的主键。在对父表进行插入之后,在对子表进行插入之前,端口会在父表中查询它刚刚插入的记录的主键。然后,端口在插入子表时使用此值。

当父表的主键由 Snowflake 生成时,这很有用。在这种情况下,此列不会作为输入 XML 传入,因此端口在将记录插入到父表中之前不知道该列的值。.

在 XML 模型中,ref 属性表示可以稍后引用列,或者应该从映射中的另一列读取列的值。为了引用由 Snowflake 生成的列的值,列元素应包含一个 ref 属性,该属性设置为保留值 LAST_INSERT_ID

<Item action="upsert">
    <Id key="true" upsert="id" ref="@@LAST_INSERT_ID" />

这表明 id 值将在插入后检索,并且可以在以后引用(通常在子表中)。要稍后引用此值,请将 ref 元素设置为相关列的名称:

<id key="true" ref="@id" />

在上面的例子中,id_是父表中主键的名称,也是子表中某列的名称。 ref 语法指示端口在插入后从父表中检索 _id,然后将检索到的值用作子表中的 id 列。

从子表中查找

通常,当从父表和子表中选择时,如果外键与父表中的主键匹配,则应仅从子表中提取记录。

例如,假设一个 Select 从父表 PurchaseOrders 和子表 PurchaseOrderLineItems 中提取采购订单数据。从 PurchaseOrders 拉取的每条记录(订单)还应拉取与该订单关联的行项目。这两个表通过共享列关联,例如 PONumber 列是 PurchaseOrders 表的主键和 PurchaseOrdersLineItems 表中的外键。如果订单项的 PONumber 与从父表中提取的订单的 PONumber 匹配,则应仅从子表中提取订单项记录。

要在知行之桥中建立这种关系,请向 Select 添加一个新过滤器并按如下方式配置它:

  • 在第一个(左侧)下拉列表中,选择作为父表外键的子表列。在上面的示例中,这将是 PurchaseOrderLineItems 表的 PONumber 列。
  • 在中间(运算符)下拉列表中,选择 equal
  • 在最后一个(右侧)输入框中,首先使用右侧的下拉箭头选择 REF。之后,输入框应该有$前缀,表示正在引用父表
  • 使用最后一个(右侧)下拉列表选择应与子表的外键匹配的父表列。在上面的示例中,这将是 PurchaseOrders 表的 PONumber 列。

只处理新的或更改的记录

可以将选择操作配置为仅检索最近更新或添加的记录。端口可以使用两种方法来检测哪些记录是新的或被修改的。

第一种方法需要一个 DateTime 列来表示记录的最后修改时间,而第二种方法需要一个列来显式存储一个值,该值表示是否应该处理记录。

使用最后修改的列

在配置面板底部找到 高级设置 设置。如果检测到 DateTime 列,则选项显示为 使用列处理新的记录或已更改的记录。将此设置为表示记录的上次修改时间的相应 DateTime 列。

使用自定义列

可以配置选择操作来更新从 Snowflake 表中成功拉取记录的列。这可以与过滤规则结合使用,该规则会仅选择列的值指示尚未拉取(或应再次拉取)的记录。

要在处理后启用列更新,请在映射编辑器底部找到 高级设置 设置。启用在成功处理行时使用值更新列,然后指定应该更新哪一列以及应该在该列中设置的值。

例如,输出映射可能配置为在提取记录后将 Processed 列更新为 1。然后,可以应用 Filter 规则,将记录限制为 Processed 不等于 1 的记录。

在此示例中,当端口处理查询模板时,它会根据模板创建一个 SELECT 语句。该模板将执行“SELECT Id、AccountId、Amount FROM INVOICE”,根据模板为结果集中的每条记录创建一个 XML 文件,并将这些文件放置在此端口的输出文件夹中。

预处理和后处理查询

你可以配置 Snowflake 端口以在执行其配置的操作之前和之后执行其他查询。 可以通过手动修改端口生成的查询代码来配置这些附加查询。 以下部分概述了此过程。

在 UPSERT 映射

在 UPSERT 映射,在所有记录被 UPSERT 插入表之前或之后,可以自动发生的查询。

如要配置此功能,首先点击在 Upsert 配置 上的 </> Code

打开的文本编辑器允许编辑数据表映射的高级功能。文本可能如下所示:

<Items>
    <Names table="`dbo`.`Names`" action="upsert">
        <ID key="true" />
        <Name /></Names>
</Items>

如要在任何数据插入表之前触发请求,定义一个节点有如下属性:

  • requireInput 设置为 false。这是让端口不再要求必须有输入与其对应。
  • insertQuery 这包含了 UPSERT 请求之前要执行的语句。
  • table(可选)- 设置为要使用额外查询定位的表的名称。(在下面的示例中,表名称是 updateTable。)如果在映射的根级别发出查询(即,作为 <Items> 元素的子元素),此属性不是必需的。 如果将查询作为另一个表的子项发出,设置表属性可确保查询与该表的列区分开来。

根据你的需要,将这个元素放在前面或者后面即可。

在下面的例子中,<runFirst> 会在运行任何 UPSERT 之前运行 EXEC [dbo.FlushTemp]

<Items>
    <runFirst table="updateTable" insertQuery="EXEC [dbo].[FlushTemp]" requireInput="false" />
    <Names table="`dbo`.`Names`" action="upsert">
        <ID key="true" />
        <Name /></Names>
</Items>

在下面例子中,<runLast> 会在运行所有 UPSERT 之后运行 EXEC [dbo.FlushTemp]

<Items>
    <Names table="`dbo`.`Names`" action="upsert">
        <ID key="true" />
        <Name /></Names>
    <runLast table="updateTable" insertQuery="EXEC [dbo].[CommitTemp]" requireInput="false" />
</Items>

例子中的元素名称(runFirstrunLast)都是占位符,你可以随意自选。

注意:在 UPSERT 映射中的预处理和后处理查询不接受任何输入文件中的值,并且他们也不会有输出。

在 SELECT 映射中

在 SELECT 映射,在所有记录被 SELECT 插入表之前或之后,可以自动发生的查询。如要配置此功能,首先点击在 Select 配置 上的 </> Code

打开的文本编辑器允许编辑数据表映射的高级功能。如要在任何数据插入表之前触发请求,定义一个节点有如下属性:

  • requireInput 设置为 false。这是让端口不再要求必须有输入与其对应。
  • selectQuery 这包含了 SELECT 请求之前要执行的语句。
  • table(可选)- 设置为要使用额外查询定位的表的名称。 (在下面的示例中,表名称是 selectTable。)如果在映射的根级别发出查询(即,作为 <Items> 元素的子元素), 此属性不是必需的。 如果将查询作为另一个表的子项发出,设置表属性可确保查询与该表的列区分开来。

根据你的需要,将这个元素放在前面或者后面即可。

在下面的例子中,<runFirst> 会在运行任何 SELECT 之前运行 EXEC [dbo].[prepTable]

<Items>
    <runFirst table="selectTable" selectQuery="EXEC [dbo].[prepTable]" outputResult="false" />
    <Names table="`dbo`.`Names`" action="select">
        <ID key="true" />
        <Name /></Names>
</Items>

在下面例子中,<runLast> 会在运行所有 SELECT 之后运行 EXEC [dbo].[cleanTable]

<Items>
    <Names table="`dbo`.`Names`" action="select">
        <ID key="true" />
        <Name /></Names>
    <runLast table="selectTable" selectQuery="EXEC [dbo].[cleanTable]" outputResult="false" />
</Items>

例子中的元素名称(runFirstrunLast)都是占位符,你可以随意自选。

注意: SELECT 映射中的预处理和后处理查询不接受查询中未硬编码的输入元素。