Могу ли я дублировать строки с помощью 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 модели, о которых я бы подумал!
Я определенно рекомендовал бы первый, чтобы начать, хотя, более легкий.