我可以使用变换复制kiba行吗?

时间:2016-01-16 13:18:25

标签: ruby-on-rails csv kiba-etl

我目前正在使用你的宝石来转换一个没有api的人员数据库网页图谱的csv。

从刮擦中我最终得到了一个csv。我可以用你的宝石处理它很好,只有一点我想知道

考虑以下数据:

====================================
| name  |  article_1   | article_2 |
------------------------------------
| Andy  |  foo         | bar       |
====================================

我可以把它变成这个:

======================
| name  |  article   |
----------------------
| Andy  |  foo       |
----------------------
| Andy  |  bar       |
======================

(我使用本教程来执行此操作:http://thibautbarrere.com/2015/06/25/how-to-explode-multivalued-attributes-with-kiba/

我在我的装载机上使用normalizelogic。代码如下: 源RowNormalizer,NormalizeArticles,CsvSource,'RP00119.csv' 变换AddColumnEntiteit,:entiteit,“ocmw”

我想知道的是,我可以使用转换实现相同的目标吗?所以代码看起来像这样:

source CsvSource, 'RP00119.csv'
transform NormalizeArticles
transform AddColumnEntiteit, :entiteit, "ocmw"

所以问题是:我可以用变换类复制一行吗?

1 个答案:

答案 0 :(得分:2)

编辑: Kiba 2完全支持您的需求。查看release notes

在目前发布的Kiba中,变换不能超过一行 - 它可以是1或0。

我正在构建的Kiba Pro产品包括一个多线程运行器(通过副作用而不是实际目标),允许转换产生任意数量的行,这正是您正在寻找的。

但是,如果没有Kiba Pro,这里有许多可以提供帮助的技术。

第一种可能性是将您的ETL脚本拆分为2.基本上,您可以在要对文章进行规范化的步骤中剪切它,并在此处放置目标。然后在第二个ETL脚本中,您将使用能够将行分解为多个的源。这就是我想你在你的案例中推荐的内容。

如果你这样做,你可以使用一个简单的Rake任务来调用ETL脚本作为一个序列,或者如果你愿意,你可以使用post_process来调用下一个(我更喜欢第一种方法,因为它可以更容易地运行一个或另一个。)

另一种方法(但对于您当前的场景来说过于复杂)将是声明相同的源N次,但仅产生给定的数据子集,例如:

pre_process do
  field_count = number_of_exploded_columns # extract from CSV?
end

(0..field_count).each do |shard|
  source MySource, shard: shard, shard_count: field_count
end

然后在MySource内,你只会有条件地产生这样的结果:

yield row if row_index % field_count == shard

这就是我想到的两种模式!

我肯定会推荐第一个开始使用,更简单。