如何配置BigQuery查询作业以允许Node.js中的大结果?

时间:2017-04-10 21:14:55

标签: javascript node.js google-bigquery

我正在尝试允许我的Node应用编写并执行查询,然后将其保存到我的BQ项目中的表中。

所有这一切都很好,直到我的结果超过尺寸阈值。然后我得到通常的“结果太大而无法返回”错误。

我已阅读node.js api文档here,并尝试将destination和allowLargeResults选项设置为配置。但它们似乎被忽略了。

如何使用Node.js运行查询并将结果写入允许大结果的指定表?

以下是我正在使用的功能。

function getData(file, outfile, email, callback){
    fs.writeFile('public/downloads/' + outfile, 'email_sha256'+'\n', function(err){
        console.log(err);
    });
    const tableName = outfile.substring(0, outfile.length - 4);
    console.log('getData function started');
    const sql = 'SELECT email_sha256 FROM temp.{table} cid JOIN etl.customer email ON cid.customer_id = email.customer_id GROUP BY email_sha256';
    const sql2 = sql.replace("{table}", tableName);
    console.log(tableName);
    const options = {
        destination: 'nf_hashed',
        query: sql2,
        timeoutMs: 10000000,
        useLegacySql: false,
        defaultDataset: 'temp'
    };
    console.log('Starting Query');
    bigquery.query(options);
}

让我知道我能做些什么来使问题更清楚。

值得注意的另一件事是,在选项列表中,“{nf_hashed”表是在useLegacySql: true时创建的,而不是在为false时创建的。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您似乎需要使用bigquery.startQuery而不是bigquery.query。看看example in the source code。您的代码可能是这样的:

bigquery.startQuery({
  destination: bigquery.dataset('temp').table('nf_hashed'),
  useLegacySql: false,
  query: sql2
}).then(function(data) {
  var job = data[0];
  var apiResponse = data[1];
  return job.getQueryResults();
});

(源代码本身有更多处理结果回调的例子。)