我有一个数据流(通过Node EventEmitter)以JSON格式发送数据,并希望在流发出时将流保存到Cassandra中。有没有一种优雅的方式来实现这个功能?
我使用的驱动程序是nodejs-dse-driver,而Cassandra版本是3.11.1。请建议是否有任何可以用来完成上述任务的推荐插件。
答案 0 :(得分:0)
您可以从源中读取数据块并将其并行发送,例如(使用async library):
const limit = 10;
stream.on('readable', () => {
let r;
const rows = [];
async.whilst(function condition() {
while ((r = csv.read()) != null && rows.length < limit) {
rows.push(r);
}
return rows.length > 0;
}, function eachGroup(next) {
// we have a group of 10 rows or less to save
// we can do it in a batch
// or we can do it in parallel with async.each()
async.each(rows, (r, eachCallback) {
// Adapt the row to parameters
// For example: sample
const params = r.split(',);
client.execute(query, params, { prepare: true}, eachCallback);
}, next);
}, function groupFinished(err) {
if (err) {
// something happened when saving
// TODO: do something with err
return;
}
// This chunk of rows emitted by stream where saved
});
}).on('end', () => {
// no more data from source
});
答案 1 :(得分:0)
这是转换流的一个很好的用例。
如果您有一个真正的可读流,那么您可以将任何Transform流传输到Readable流中。我不认为事件发射器是可读的流,因此您可能需要更改原始数据获取实现。
有关实现的详细信息,请参阅NodeJS文档。 https://nodejs.org/api/stream.html#stream_new_stream_transform_options
取决于您的NodeJS版本,这样的东西。
const myTransformStream = new Transform({
objectMode: true,
transform(row, encoding, callback) {
// insert into Cassandra code here
cassandra.execute(query, row, {prepare: true}, () => {
// after the execute is done, callback to process more
callback(null, row);
});
}
});
originalStream.pipe(myTransformStream);