我可以使用转换复制带有 kiba 的行吗?

Can I duplicate rows with kiba using a transform?

我目前正在使用您的 gem 转换从没有 api.

的个人数据库中抓取的 csv

从 scraping 我得到了一个 csv。我可以使用你的 gem 很好地处理它,我想知道的只有一点

考虑以下数据:

====================================
| 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"

所以问题是:我可以通过转换 class 实现复制一行吗?

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

在当前发布的 Kiba 中,一个转换不能超过一行 - 它要么是一,要么是零。

我正在构建的 Kiba Pro 产品包括一个多线程 运行ner,它发生(通过 side-effect 而不是实际目标)以允许转换产生任意数量的行,这就是你要照顾的。

但话虽如此,如果没有 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

这就是我会想到的 2 种模式!

我肯定会推荐第一个开始,更容易。