Могу ли я дублировать строки с помощью Kiba, используя преобразование?

В настоящее время я использую ваш драгоценный камень для преобразования CSV, который был скопирован из базы данных персонала, у которого нет API.

Из соскоба я закончил с 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 на моем загрузчике для этого. Код выглядит следующим образом: source RowNormalizer, NormalizeArticles, CsvSource, 'RP00119.csv' transform AddColumnEntiteit,:entiteit, "ocmw"


Что мне интересно, могу ли я добиться того же, используя преобразование? Чтобы код выглядел так:

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

Итак, вопрос: могу ли я добиться дублирования строки с классом преобразования?

1 ответ

Решение

РЕДАКТИРОВАТЬ: 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

Это 2 модели, о которых я бы подумал!

Я определенно рекомендовал бы первый, чтобы начать, хотя, более легкий.

Другие вопросы по тегам