Kiba etl 如何在提取器中过滤数据?

Kiba etl 如何在提取器中过滤数据?,kiba-etl,Kiba Etl,我有一个长时间运行的管道,其中有一些失败的项目(在流程结束时没有加载的项目,因为它们没有通过数据库验证或类似的操作) 我想重新运行管道,但只处理上次运行时导入失败的项目 我有一个适当的系统,在那里我检查每个项目ID(我从外部来源收到)。我在我的装载机上做这个检查。如果数据库中已经有该项ID,我将跳过在数据库中加载/插入该项 这很有效。但是,这很慢,因为我确实为每个项目提取了转换负载,只有在加载时,我才查询数据库(每个项目一个查询)并比较项目ID 我想早点把这些记录过滤掉。如果我在transfor

我有一个长时间运行的管道,其中有一些失败的项目(在流程结束时没有加载的项目,因为它们没有通过数据库验证或类似的操作)

我想重新运行管道,但只处理上次运行时导入失败的项目

我有一个适当的系统,在那里我检查每个项目ID(我从外部来源收到)。我在我的装载机上做这个检查。如果数据库中已经有该项ID,我将跳过在数据库中加载/插入该项

这很有效。但是,这很慢,因为我确实为每个项目提取了转换负载,只有在加载时,我才查询数据库(每个项目一个查询)并比较项目ID

我想早点把这些记录过滤掉。如果我在transformer中执行此操作,则只能对每个项目执行一次。看起来提取器可能就是那个地方,或者我可以将记录分批传递给transformer,然后过滤并分解(第一个)transformer中的项目

这里有什么更好的方法

我也在考虑提取器的可重用性,但我想我可以接受这样一个事实:一个提取器同时进行提取和过滤。我认为最好的解决方案是能够连接多个提取器。然后我会有一个提取数据的,另一个过滤数据的

编辑:也许我可以这样做:

已导入\u项目\u id=Items.pull(:item\u id)
基巴,快跑(
Kiba.do
来源(……)
转换do |项|
下一步如果已导入项目ID。包括?(项目)
项目
结束
变换(…)
目的地(…)
结束
)
我想这样行吗?

一些提示:

1/管道越高(越快),越好。如果您能找到一种从源代码中过滤出来的方法,那么成本会更低,因为您根本不需要操作数据

2/如果您的刻度足够小,您可以在
pre_进程
块的开始处仅加载ID的完整列表(主要是您在代码示例中想到的),然后在源代码之后进行比较。显然,它不会无限扩展,但根据数据集的大小,它可以工作很长时间

3/如果您需要更高的规模,我建议您要么使用缓冲转换(将N行分组),实现单个SQL查询以验证目标数据库中是否存在所有N行ID,要么使用一组行,然后实际分解

希望这有帮助

最后,我们在Kiba解析块中“内联”过滤:
rb已导入的项目id=Document.pull(:external\u item\u id)transform do | item | next如果已导入的项目id.include?(item['id')item end