2017-09-12 23 views
0

我为BigQuery使用Google Cloud Node库。我使用的是createQueryStream method从BigQuery的数据流:Google BigQuery节点库:如何分批流式传输数据?

var query = 'SELECT transfer_date, price, postcode FROM '; 
query += '[table] ORDER BY transfer_date LIMIT 10000'; 
bigquery.createQueryStream(query) 
    .on('error', console.error) 
    .on('data', function(row) { 
    console.log(row); 
    }) 
    .on('end', function() { 
    // All rows retrieved. 
    }); 

这分别输出每一行控制台。不过,我想分批更新我的申请,说每10,000个结果。那么如何修改查询来以10,000个数据块流式传输数据呢?

query method有一个autoPaginate选项,但我不明白如何使用它。

或者我是否需要手动编写一个函数来触发每个10,000行?但是这似乎效率很低。

回答

0

Bigquery node.js API在执行查询时自动处理分页,您不必执行任何操作。 您正在使用的API方法是一次对结果记录一个。 如果你只在批量处理结果未在分页每个REST请求过程中是如何发生的,那么你可能想尝试兴趣和:

var rows = []; 
    var batchSize = 10 * 1000; 
    var counter = 0; 
    var batchCounter = 0; 
    var query = 'SELECT transfer_date, price, postcode FROM '; 
    query += '[table] ORDER BY transfer_date'; 

    var bigquery = require('@google-cloud/bigquery')(); 
    bigquery.createQueryStream(query) 
    .on('error', console.error) 
    .on('data', function(row) { 
     //Either use the stream record or keep pushing it to stack. 
      if(counter < batchSize){ 
       rows.push(row);      
       counter++; 
      }else{ 
       counter=0; 
       batchCounter++; 
       //process the batch of records i.e., fire the custom event or send the content to down-stream applications etc. 
       rows.forEach(function(row){console.log(row)}); 
       console.log('Completed batch no.:'+batchCounter); 
       rows.clear; 
      } 
    }) 
    .on('end', function() { 
     //If you want to process results only at the end. 
     console.log('+++++End of the query results+++++')); 
    }); 

选项对象createQueryStream方法是一样的查询方法。 autoPaginate选项设置为true默认情况下。 出自文件,这里是一个link

P.S.您始终可以通过在查询中包含LIMIT子句来限制查询流中的记录总数。

+0

谢谢。尽管如此,这不会在请求中返回最多10,000行吗?我想处理数百万行,但每次有10,000行可用时,在客户端代码中触发一个事件。 – Richard

+0

我已经更新了答案。 ** maxResults **参数控制在分页过程中每个页面要包含多少条记录。我已经运行了一个快速测试,看起来您只能在查询中使用LIMIT子句控制** createQueryStream **方法中的记录总数。 ** maxApiCalls **和** maxResults **仅影响内部分页。 –

相关问题