使用node.js索引/摄取非常大的json文件到数据库

时间:2016-04-09 08:38:39

标签: javascript json node.js jsonp

我继承了一个巨大的json文件,我正在尝试将其索引到elasticsearch(不是真正的数据库,但不会挂起它应该适用于大多数db ingest)。我正在使用node来进行摄取。我已经尝试了流和异步,但我很难过,我没有框架来解决这个问题 - 没有内存溢出等。

我无法发布1到1,但它实际上是一个多维对象,看起来像:

[ 
   { 
     document: {
        type: 1,
        type2: 2,
        type3: {...}
    },
    {...}
]

我只需要提取文档,我可以使用elasticsearch客户端并批量处理它们。我需要放慢流,解析和块。

完全卡住...帮助stackoverflow它是星期五我想回家; )。

1 个答案:

答案 0 :(得分:1)

基于migg对json-parse-stream的建议 - 我试过的第三个json流库 - 我终于有了一个工作摄取。事实上它正在我写这篇文章时运行。希望有人会觉得这很有用。

const fs = require('graceful-fs');
const parse = require('json-parse-stream');
const es = require('event-stream');
const client = new require('elasticsearch').Client();
var WritableBulk = require('elasticsearch-streams').WritableBulk;
var TransformToBulk = require('elasticsearch-streams').TransformToBulk;


var rs = fs.createReadStream('./resources/mydoc.json');

var bulkExec = function (body, callback) {
  console.log(body);
  client.bulk({
    index: 'my_index',
    type: 'my_type',
    body: body
  }, callback);
};

var toBulk = new TransformToBulk(() => { return { _index: 'my_index', _type: 'my_type' }; });


const done = (err, res) =>  {
  if (err) {
    console.log(err);
  }
  console.log(res);
  console.log('go get a drink you deserve it');
};

var ws = new WritableBulk(bulkExec);

rs.pipe(parse())
.pipe(es.mapSync(function (element) {
  var a =  [];
  if (element.key === 'document') {
    a = element.value;
    return a;
  }
}))
.pipe(toBulk)
.pipe(ws).on('finish', done);