Kiba 是一个非常小的库,据我了解,它的大部分价值来自于强制执行小型独立转换的模块化架构。
但是,在我看来,一系列串行转换的模型并不适合我们面临的大多数 ETL 问题。为了解释这个问题,让我举一个人为的例子:
源产生具有以下结构的哈希
{ spend: 3, cost: 7, people: 8, hours: 2 ... }
我们首选的输出是哈希列表,其中一些键可能与源中的相同,尽管值可能不同
{ spend: 8, cost: 10, amount: 2 }
现在,计算结果支出需要一系列转换:ConvertCurrency, MultiplyByPeople
等等等等。计算成本也是如此:ConvertCurrencyDifferently, MultiplyByOriginalSpend
.. 请注意,成本计算取决于原始(未转换的)支出值。
最自然的模式是在两个独立的管道中计算支出和成本,然后合并最终输出。如果您愿意,可以使用 map-reduce 模式。我们甚至可以从并行运行管道中受益。
但是在我的情况下,这并不是性能问题(因为转换非常快)。问题在于,由于 Kiba 将所有转换作为一组连续步骤应用,成本计算将受到支出计算的影响,最终我们将得到错误的结果。
kiba 有办法解决这个问题吗?我唯一能想到的是确保目标名称与源名称不同,例如“originSpend”和“finalSpend”。然而,它仍然困扰着我,我的支出计算管道必须确保为每个步骤传递完整的密钥集,而不是仅仅传递与其相关的密钥,然后最后合并成本密钥。或者也许可以定义两个独立的 kiba 作业,并让一个主作业调用这两个并将它们的结果合并到最后?对此,最 kiba 惯用的解决方案是什么?
将 ETL 管道拆分为多个并行路径似乎是大多数 ETL 工具的一个关键特性,所以我很惊讶它似乎不是 kiba 支持的东西?