如何强制增量 Foundry Transforms 作业以非增量方式构建而不影响语义版本?
How to force an incremental Foundry Transforms job to build non-incrementally without bumping the semantic version?
如何在不更改转换存储库中的语义版本的情况下强制非增量构建特定数据集?
关于我们特定用例的详细信息:
我们有大约 50 个数据集,这些数据集是通过手动注册和 for 循环通过单个增量 python 定义的。此转换的输入可以是 100 到 10000 个小 gzip 文件,因此当数据集 运行s 较大时,它最终会将所有这些划分为少数大小合适的 parquet 文件,这非常适合我们的下游工作。但是,在这项工作 运行ning 几个月后(文件每小时到达一次),输出中也会有大量小的 parquet 文件。我们希望能够强制对这个单一数据集进行快照构建,而不必改变会触发所有 50 个数据集的快照构建的转换的语义版本。这可能吗?
我知道一个潜在的解决方法是在转换本身中定义“最大输出文件”,读取现有输出中的当前文件数,并在当前超过最大值时强制创建快照。但是,由于此管道对时间敏感(需要在一小时内 运行),这会给管道带来一定程度的不可预测性,因为快照构建需要更长的时间。我们希望能够将这些完整的快照构建设置为 运行 大约每个月在周末一次。
在输出数据集上提交一个空的追加事务。
我想你可以
对于输入:
输入 = input.dataframe('current')
对于输出:
output.set_mode('replace')
我认为您只需在 运行 时决定是否在 replace
或 modify
的输出中使用 TransformOutput.set_mode()
。
这样,您可以根据输入的大小决定是否要覆盖或附加到输出
最近我首选的方法是使用我称之为“快照数据集”的东西。这种方法允许您在任意点将快照事务注入管道,并定期安排快照构建,这对于保持 long-lived low-latency 管道性能非常有用。
为此,我在声明我的转换时使用了一个包装器(java 转换,在我的例子中,但它同样适用于 python),它为我的转换添加了一个额外的输入。
假设您从读取数据集 A
和 B
并生成数据集 C
的转换开始。包装器将插入一个名为 CSnapshotDataset
的额外数据集作为输入,并生成一个生成此(空)数据集的转换。
生成 CSnapshotDataset
的自动生成的转换将始终在构建时将一个空的 SNAPSHOT
事务放入数据集。当有来自 CSnapshotDataset
的新快照交易时,您的转换也会输出快照交易。
然后从给定点开始对您的管道进行快照,例如从数据集 C
开始并包括数据集 C
,您只需 select C
s 快照数据集(CSnapshotDataset
在这种情况)并构建它。管道的下一个(预定)运行 将快照 C
及其下游的所有内容。
到 运行 定期执行此操作,然后您可以设置一个计划来构建 CSnapshotDataset
。
我慷慨地应用了这个包装器(通常用于我编写的任何转换),这让我可以灵活地从可能需要它的任何数据集快照管道。
虽然 up-front 需要多做一些设置,但这样做的主要优点是:
- 只需单击一下即可启动快照,只需单击几下即可设置计划快照,而不必进行多次
curl
调用
- 它保持输入和输出数据集的交易历史干净
- 它完全发生 in-platform,不需要提取令牌,使用 command-line、jenkins 或类似工具
如何在不更改转换存储库中的语义版本的情况下强制非增量构建特定数据集?
关于我们特定用例的详细信息:
我们有大约 50 个数据集,这些数据集是通过手动注册和 for 循环通过单个增量 python 定义的。此转换的输入可以是 100 到 10000 个小 gzip 文件,因此当数据集 运行s 较大时,它最终会将所有这些划分为少数大小合适的 parquet 文件,这非常适合我们的下游工作。但是,在这项工作 运行ning 几个月后(文件每小时到达一次),输出中也会有大量小的 parquet 文件。我们希望能够强制对这个单一数据集进行快照构建,而不必改变会触发所有 50 个数据集的快照构建的转换的语义版本。这可能吗?
我知道一个潜在的解决方法是在转换本身中定义“最大输出文件”,读取现有输出中的当前文件数,并在当前超过最大值时强制创建快照。但是,由于此管道对时间敏感(需要在一小时内 运行),这会给管道带来一定程度的不可预测性,因为快照构建需要更长的时间。我们希望能够将这些完整的快照构建设置为 运行 大约每个月在周末一次。
在输出数据集上提交一个空的追加事务。
我想你可以
对于输入: 输入 = input.dataframe('current')
对于输出: output.set_mode('replace')
我认为您只需在 运行 时决定是否在 replace
或 modify
的输出中使用 TransformOutput.set_mode()
。
这样,您可以根据输入的大小决定是否要覆盖或附加到输出
最近我首选的方法是使用我称之为“快照数据集”的东西。这种方法允许您在任意点将快照事务注入管道,并定期安排快照构建,这对于保持 long-lived low-latency 管道性能非常有用。
为此,我在声明我的转换时使用了一个包装器(java 转换,在我的例子中,但它同样适用于 python),它为我的转换添加了一个额外的输入。
假设您从读取数据集 A
和 B
并生成数据集 C
的转换开始。包装器将插入一个名为 CSnapshotDataset
的额外数据集作为输入,并生成一个生成此(空)数据集的转换。
生成 CSnapshotDataset
的自动生成的转换将始终在构建时将一个空的 SNAPSHOT
事务放入数据集。当有来自 CSnapshotDataset
的新快照交易时,您的转换也会输出快照交易。
然后从给定点开始对您的管道进行快照,例如从数据集 C
开始并包括数据集 C
,您只需 select C
s 快照数据集(CSnapshotDataset
在这种情况)并构建它。管道的下一个(预定)运行 将快照 C
及其下游的所有内容。
到 运行 定期执行此操作,然后您可以设置一个计划来构建 CSnapshotDataset
。
我慷慨地应用了这个包装器(通常用于我编写的任何转换),这让我可以灵活地从可能需要它的任何数据集快照管道。
虽然 up-front 需要多做一些设置,但这样做的主要优点是:
- 只需单击一下即可启动快照,只需单击几下即可设置计划快照,而不必进行多次
curl
调用 - 它保持输入和输出数据集的交易历史干净
- 它完全发生 in-platform,不需要提取令牌,使用 command-line、jenkins 或类似工具