有没有办法逐行或分批而不是一次写入 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
,但这可能不是您在这里需要的)。
希望这能正确回答您的问题!
木场真的很帅!
我正在尝试在我的 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
,但这可能不是您在这里需要的)。
希望这能正确回答您的问题!