有没有一种方法可以逐行或批量而不是一次全部写入Kiba CSV目标?

时间:2019-03-08 16:14:39

标签: kiba-etl

Kiba真的很酷!

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

1 个答案:

答案 0 :(得分:1)

很高兴您喜欢Kiba!

我将通过声明您的理解不正确来使您高兴。

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

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