2

我目前正在使用您的 gem 来转换从没有 api 的个人数据库中抓取的 csv。

从抓取中我最终得到了一个 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。代码如下所示:source RowNormalizer, NormalizeArticles, CsvSource, 'RP00119.csv' transform AddColumnEntiteit, :entiteit, "ocmw"


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

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

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

4

1 回答 1

2

编辑:Kiba 2 完全支持您所需要的。查看发行说明

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

我正在构建的 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

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

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

于 2016-01-20T08:06:28.090 回答