有没有办法逐行或分批而不是一次写入 Kiba CSV 目标?

Is there a way to write to Kiba CSV destination line by line or in batches instead of all at once?

木场真的很帅!

我正在尝试在我的 Rails 应用程序中设置一个 ETL 过程,我会将大量数据从我的 SQL 数据库转储到 CSV 文件中。如果我自己实现这个,我会使用类似 find_each 的东西一次加载 1000 条记录并将它们分批写入文件。有没有办法使用 Kiba 来做到这一点?根据我的理解,默认情况下,源中的所有 rows 都会传递到目标,这对我的情况来说是不可行的。

很高兴你喜欢木场!

我要让你高兴的是,你的理解是错误的。

行在 Kiba 中一一生成和处理。

要查看具体工作原理,我建议您尝试使用以下代码:

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,但这可能不是您在这里需要的)。

希望这能正确回答您的问题!