2017-11-27 2 views
0

Ein Api-Server läuft auf Kubernetes Engine (GKE). Benutzer können relativ kleine Datenmengen (~ 100 MB, mehrere CSV-Dateien mit derselben Datenstruktur) von Clientanwendungen auf Cloud Storage (GCS) hochladen. Sobald der Upload abgeschlossen ist, muss ich alle Daten aus allen neuen .csv-Dateien in eine einzige vorhandene BigQuery-Tabelle mit einigen benutzerspezifischen Parametern importieren (markieren Sie jede Zeile mit einer Benutzer-ID, die etwa so sein mag). Ordnung spielt keine Rolle.Wie wird der Daten-Upload von Cloud Storage zu BigQuery von Kubernetes Engine ausgelöst?

Google Docs bietet hierfür GUI-basierte Lösungen und Befehlszeilenlösungen an. Obwohl ich davon ausgehe, gibt es eine Möglichkeit, den Upload auszulösen und dessen Fortschritt vom GKE-basierten Server selbst zu verfolgen. Wie mache ich das?

Nicht sicher, ob das wichtig ist: GKE api Server wird auf NodeJS geschrieben.

+0

Sie können die CSV-Datei als Verbundtabelle definieren (als Teil eines BigQuery-Abfrageauftrags) und dann eine Abfrage wie "SELECT *, FROM MyCsvTable;" ausführen? Sie können angeben, dass sie als Teil des Abfrageauftrags an die vorhandene Tabelle angefügt werden sollen. –

+0

@ElliottBrossard meinst du "Abfrage von CSV, ohne es auf BigQuery hochzuladen"? Ich denke, das wird viel weniger effizient sein, als mit diesen Daten in BigQuery selbst nach dem Upload umzugehen – stkvtflw

+0

Es hängt von dem Modell, das ich denke. Wenn Sie viele 100 MB-Dateien gleichzeitig verarbeiten möchten, stimme ich zu, dass das Laden der CSV-Dateien in BigQuery die bessere Wahl ist. Für eine "Echtzeit" -Lösung könnten Sie föderierte Tabellen verwenden. Haben Sie in jedem Fall versucht, die BigQuery-API von NodeJS zu verwenden? Es hört sich so an, als müssten Sie es verwenden. –

Antwort

1

Hier ist ein Beispiel für das Hochladen einer Datei nach GCS, die aus der BigQuery documentation stammt. Sie können den Job nach Bedarf konfigurieren. es gibt ein paar Hinweise auf dieser Seite und ein link to the GitHub repo mit zusätzlicher Funktionalität:

// Imports the Google Cloud client libraries 
const BigQuery = require('@google-cloud/bigquery'); 
const Storage = require('@google-cloud/storage'); 

// The project ID to use, e.g. "your-project-id" 
// const projectId = "your-project-id"; 

// The ID of the dataset of the table into which data should be imported, e.g. "my_dataset" 
// const datasetId = "my_dataset"; 

// The ID of the table into which data should be imported, e.g. "my_table" 
// const tableId = "my_table"; 

// The name of the Google Cloud Storage bucket where the file is located, e.g. "my-bucket" 
// const bucketName = "my-bucket"; 

// The name of the file from which data should be imported, e.g. "file.csv" 
// const filename = "file.csv"; 

// Instantiates clients 
const bigquery = BigQuery({ 
    projectId: projectId 
}); 

const storage = Storage({ 
    projectId: projectId 
}); 

let job; 

// Imports data from a Google Cloud Storage file into the table 
bigquery 
    .dataset(datasetId) 
    .table(tableId) 
    .import(storage.bucket(bucketName).file(filename)) 
    .then((results) => { 
    job = results[0]; 
    console.log(`Job ${job.id} started.`); 

    // Wait for the job to finish 
    return job.promise(); 
    }) 
    .then((results) => { 
    // Get the job's status 
    return job.getMetadata(); 
    }).then((metadata) => { 
    // Check the job's status for errors 
    const errors = metadata[0].status.errors; 
    if (errors && errors.length > 0) { 
     throw errors; 
    } 
    }).then(() => { 
    console.log(`Job ${job.id} completed.`); 
    }) 
    .catch((err) => { 
    console.error('ERROR:', err); 
    }); 

Nach dem Hochladen können Sie run a query, die die neu hochgeladene CSV-Datei (en) und fügt das Ergebnis an die gewünschte Zieltabelle abfragt.

Verwandte Themen