我目前正在使用你的宝石来转换一个没有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"
所以问题是:我可以用变换类复制一行吗?
答案 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
这就是我想到的两种模式!
我肯定会推荐第一个开始使用,更简单。