2017-09-12 5 views
0

Ich verwende die Google Cloud Node-Bibliotheken für BigQuery. Ich verwende den createQueryStream method Daten von BigQuery zu streamen:Google BigQuery Node-Bibliothek: Wie man Daten in Batches streamt?

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. 
    }); 

Dies gibt jede Zeile einzeln an die Konsole. Allerdings möchte ich meine Anwendung in Chargen aktualisieren, sagen alle 10.000 Ergebnisse. Wie ändere ich die Abfrage, um Daten in Blöcken von 10.000 zu streamen? Die hat eine autoPaginate Option, aber ich verstehe nicht, wie man es benutzt.

Oder muss ich manuell eine Funktion schreiben, die jeweils 10.000 Zeilen abfeuert? Aber das scheint sehr ineffizient zu sein.

Antwort

0

Bigquery node.js API kümmert sich um die Seitenumbruch automatisch, wenn Sie die Abfrage ausführen, müssen Sie nichts tun. Die API-Methode, die Sie verwenden, ist Stream Ergebnis Datensatz eins zu einer Zeit. Wenn Sie daran interessiert sind nur in Verarbeitungsergebnisse in Batch und nicht in wie Paginierung während jeder REST Anfrage geschieht dann möchten Sie vielleicht versuchen:

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+++++')); 
    }); 

Optionen Objekt in createQueryStream Methode ist als Abfragemethode gleich. autoPaginate Die Option ist standardmäßig auf true eingestellt. Von Dokumenten, Hier ist ein link

P.S. Sie können die Gesamtanzahl der Datensätze im Abfragestream immer begrenzen, indem Sie die LIMIT-Klausel in die Abfrage einschließen.

+0

Danke. Wird das nicht ein Maximum von 10.000 Zeilen in der Anfrage zurückgeben? Ich würde gerne Millionen von Zeilen verarbeiten, aber jedes Mal, wenn 10.000 Zeilen verfügbar sind, ein Ereignis in meinem clientseitigen Code auslösen. – Richard

+0

Ich habe die Antwort aktualisiert. Der Parameter maxResults ** steuert, wie viele Datensätze während der Paginierung auf jeder Seite enthalten sein müssen. Ich habe einen schnellen Test ausgeführt und es scheint, dass Sie nur die Gesamtzahl der Datensätze in der ** createQueryStream ** -Methode mit der LIMIT-Klausel in der Abfrage steuern können. ** maxApiCalls ** und ** maxResults ** wirken sich nur auf die interne Seitennummerierung aus. –

Verwandte Themen