我可以使用转换复制带有 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 种模式!
我肯定会推荐第一个开始,更容易。
我目前正在使用您的 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 种模式!
我肯定会推荐第一个开始,更容易。