2

現在、あなたの宝石を使用して、API を持たない個人データベースから Web スクレイピングされた csv を変換しています。

スクレイピングから、私はcsvになりました。私はあなたの宝石を使ってそれをかなりうまく処理することができます.1つだけ疑問に思っています

次のデータを検討してください。

====================================
| 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 では、変換はまだ 1 行を超えることはできません。1 行または 0 行です。

私が構築している Kiba Pro 製品には、(実際の目標としてではなく副作用によって) 変換が任意の数の行を生成できるようにするマルチスレッド ランナーが含まれています。

とはいえ、Kiba Pro がなくても、役立つテクニックがいくつかあります。

最初の可能性は、ETL スクリプトを 2 つに分割することです。基本的には、記事を正規化したいステップでそれを切り取り、代わりにここに宛先を置きます。次に、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パターンです!

私は間違いなく最初のものを始めることをお勧めしますが、より簡単です.

于 2016-01-20T08:06:28.090 に答える