使用node.js将数据流保存到Cassandra

时间:2017-12-12 14:07:09

标签: node.js cassandra datastax-enterprise cassandra-3.0

我有一个数据流(通过Node EventEmitter)以JSON格式发送数据,并希望在流发出时将流保存到Cassandra中。有没有一种优雅的方式来实现这个功能?

我使用的驱动程序是nodejs-dse-driver,而Cassandra版本是3.11.1。请建议是否有任何可以用来完成上述任务的推荐插件。

2 个答案:

答案 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);