【发布时间】:2018-03-04 16:49:58
【问题描述】:
我有一个大型 JSON 文件,我想对其进行轻微转换并作为新表发送到 Google BigQuery。我过去在 node.js 中使用过流,效果很好,我认为这是解决这个问题的一个不错的解决方案。我正在使用official Google node.js BigQuery API。我能够毫无问题地创建具有正确架构的表。我认为我已经准备好了解决方案。该程序完成得很好,但没有数据最终落入我的 BigQuery 表中。
相关代码如下
我的 node.js 流代码:
fs.createReadStream('testfile.json')
.pipe(require('split')())
.pipe(require('event-stream').mapSync((data) => {
if (data.length > 1) {
let obj;
try {
obj = JSON.parse('{' + (data[data.length - 1] === ',' ? data.slice(0, data.length - 1) : data) + '}');
} catch (e) {
console.error('error parsing!', e, data);
}
let user = Object.keys(obj)[0];
let company = obj[user][0];
let item = {
user: user,
company: company
};
console.log(item);
return JSON.stringify(item);
}
}))
.pipe(table.createWriteStream('json'))
.on('error', (e) => {
console.error('Error!', e);
})
.on('complete', (job) => {
console.log('All done!', job);
});
testfile.json 看起来像这样:
{
"a":["a company", "1234567"],
"b":["b company", "1234214"],
"c":["c company", "12332231"]
}
当我运行程序时,输出如下所示:
{ user: 'a', company: 'a company' }
{ user: 'b', company: 'b company' }
{ user: 'c', company: 'c company' }
All done! Job {
metadata:
{ kind: 'bigquery#job',
/* lots more data here */
docs for createWriteStream 并没有非常详细地说明数据应该采用什么格式才能泵入写入流,所以我觉得我有点盲目。
【问题讨论】: