Есть ли способ писать в строку назначения Kiba CSV построчно или партиями вместо всех сразу? - PullRequest
0 голосов
/ 08 марта 2019

Kiba - это действительно круто!

Я пытаюсь настроить процесс ETL в своем приложении Rails, где я собираю большой объем данных из базы данных SQL в файл CSV.Если бы я сам реализовал это, я бы использовал что-то вроде find_each, чтобы загружать, скажем, 1000 записей за раз и записывать их в файл партиями.Есть ли способ сделать это с помощью Kiba?Из моего понимания по умолчанию все rows из источника передаются в пункт назначения, что было бы неосуществимо для моей ситуации.

1 Ответ

1 голос
/ 08 марта 2019

Рад, что тебе нравится Киба!

Я собираюсь сделать тебя счастливым, заявив, что твое понимание неверно.

Строки приведены и обработаны один за другим в Кибе.

Чтобы увидеть, как все работает, я предлагаю вам попробовать этот код:

class MySource
  def initialize(enumerable)
    @enumerable = enumerable
  end

  def each
    @enumerable.each do |item|
      puts "Source is reading #{item}"
      yield item
    end
  end
end

class MyDestination
  def write(row)
    puts "Destination is writing #{row}"
  end
end

source MySource, (1..10)
destination MyDestination

Запустите это, и вы увидите, что каждый элемент прочитан, а затем записан.

Теперьв вашем конкретном случае - то, что выше, означает, что вы можете реализовать свой источник следующим образом:

class ActiveRecord
  def initialize(model:)
    @model = model
  end

  def each
    @model.find_each do |record|
      yield record
    end
  end
end

, тогда вы можете использовать его следующим образом:

source ActiveRecordSource, model: Person.where("age > 21")

(Вы также можете использовать find_in_batches если вы хотите, чтобы каждая строка представляла собой массив из нескольких записей, но это, вероятно, не то, что вам здесь нужно).

Надеюсь, это правильно ответит на ваш вопрос!

...