2017-03-27 2 views
1

Ich versuche mit Google Apps Script Daten mithilfe der BigQuery-API in eine BigQuery-Tabelle einzufügen. Die anzuhängenden Daten sind derzeit im CSV-Format. Bisher habe ich festgestellt, dass Sie stream data into BigQuery mit tabledata().insertAll() verwenden können, aber es sieht so aus, dass erfordert JSON-Format und ich bin nicht einmal davon überzeugt, dass es tun würde, was ich brauche. Gibt es eine einfache Lösung, die ich vermisse? Da ich weiß, dass BigQuery das Anhängen unterstützt, konzentriert sich alles, was ich finde, auf das Laden von Daten in neue Tabellen.Kann ich Daten aus einer CSV-Datei mithilfe der API an eine vorhandene BigQuery-Tabelle anhängen?

EDIT: Klingt wie tabledata().insertAll() in der Tat die richtige Methode zu verwenden ist (hoffentlich). Also konvertierte ich meine Datei stattdessen in json, aber jetzt bin ich fest, wie ich sie benutzen soll. Ich versuche das, was ich mache, von der reference page for it abzustützen, aber es ist immer noch sehr verwirrend für mich. Zur Zeit bekomme ich einen 404 Fehler, wenn ich meinen Code starte und es den fetch Aufruf trifft. Ich versuche einen URL-Abruf durchzuführen, vielleicht sollte ich das nicht tun? Ich bin wirklich neu in APIs und ich finde immer noch heraus, wie sie funktionieren. Hier ist der Code Ich habe derzeit das ist diese verursacht:

var tableId = 'users'; 
var file = DriveApp.getFileById(jsonId); 
//I don't know if a blob is the type that I want or not, but I'm trying it 
var data = file.getBlob(); 

var url = 'https://www.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET_ID/tables/tableId/insertAll' 
.replace("PROJECT_ID", params.PROJECT_ID) 
.replace("DATASET_ID", params.DATASET_ID) 
.replace("tableId", tableId); 

var response = UrlFetchApp.fetch(url, { 
"kind": "bigquery#tableDataInsertAllRequest", 
"skipInvalidRows": 0, 
"ignoreUnknownValues": 0, 
"rows": [ 
    { 
    "json": data 
    } 
], 
headers: { 
    Authorization: 'Bearer ' + service.getAccessToken() 
} 
}); 


var result = JSON.parse(response.getContentText()); 
Logger.log(JSON.stringify(result, null, 2)); 
+0

Sie haben bereits die Methode identifiziert, die Daten in das richtige Format zu erhalten ist nur eine Frage der CSV-Parsing und es in JSON kodiert, welchem ​​Schritt Hast du Probleme damit? Was hast du schon versucht –

+0

Also ist die 'insertAll()' Methode in der Tat die, die ich will? Mein Problem ist dann, einen vernünftigen Weg zu finden, die CSV-Datei in json zu konvertieren (idealerweise mit Google Apps Script), denke ich. Plus herauszufinden, wie der Funktionsaufruf funktioniert. Ich war nur sehr skeptisch, dass dies die richtige Methode war, nach der ich suchte. –

+0

OK Ich denke ich habe meine Daten jetzt im JSON-Format (hoffentlich richtig). Von hier aus habe ich Schwierigkeiten, tatsächlich den Aufruf der API zu machen. Ich kann meine Frage jetzt mit weiteren Details aktualisieren. –

Antwort

1

Dies ist nicht der direkteste von csv zu BQ JSON, aber es ist ein Code, den ich, dass ich verwenden, sollten Sie auf der BigQuery Seite helfen.

var PROJECT_ID = "xxx"; 
var DATASET_ID = "yyy"; 
function convertValuesToRows(data) { 
    var rows = []; 
    var headers = data[0]; 

    for (var i = 1, numColumns = data.length; i < numColumns; i++) { 
    var row = BigQuery.newTableDataInsertAllRequestRows(); 
    row.json = data[i].reduce(function(obj, value, index) { 
     obj[headers[index]] = value; 
     return obj 
    }, {}); 
    rows.push(row); 
    }; 
    return rows; 
} 

function bigqueryInsertData(data, tableName) { 
    var insertAllRequest = BigQuery.newTableDataInsertAllRequest(); 
    insertAllRequest.rows = convertValuesToRows(data); 
    var response = BigQuery.Tabledata.insertAll(insertAllRequest, PROJECT_ID, DATASET_ID, tableName); 
    if (response.insertErrors) { 
    Logger.log(response.insertErrors); 
    } 
} 

Auf diese Weise können Sie jede GAS Stil Wertmatrix liefern (von getValues ​​oder in der Tat Utilities.parseCsv)

convertValuesToRows wird ein 2D-Array von Strings (mit Header) nehmen und kodieren sie in dem Format BigQuery benötigt, zum Beispiel

[["H1", "H2", "H3"], 
[1 , 2 , 3 ], 
[4 , 5 , 6 ]]; 

wird die int insertRows Anfrage hinzugefügt wird er Form von Schlüssel-Wert-Paaren, dh

[{H1: 1, H2: 2, H3: 3}, 
{H1: 4, H2: 5, H3: 6}] 

Sie brauchen nur um die erste Darstellung als dass zu befürchten ist, was Sie in bigQueryInsertData passieren zusammen mit dem Tisch Name, dem die Daten zugeführt werden sollen (Das Schema der Tabelle muss mit dem übereinstimmen, was Sie senden), und die Konverterfunktion wird von innen aufgerufen.

Utilities.parseCsv bereits einen 2D-Array von Strings zurück, so dass Sie im Grunde bigQueryInsertData(Utilities.parseCsv(data.getDataAsString()), "myTable") nennen

+0

Ich kann nicht ganz sagen, wie Sie Ihre Antwort nutzen können. Ich versuche zu verstehen, was ich hier ansehe, aber ich bin irgendwie verwirrt. Könntest du vielleicht erklären, was dieser Code ein bisschen macht? Parsiere ich den JSON irgendwie in einzelne Reihen, um eins nach dem anderen einzusetzen? Und gibt es irgendwo eine Dokumentation für die Scripts-Version der API? Alles, was ich mache, ist Autovervollständigung in Skripten. –

+0

Bitte sehen Sie meine aktualisierte Antwort, hoffe, dass die Dinge ein wenig aufklärt. Sobald Sie die BigQuery-API aktiviert haben, können Sie die Funktion wie folgt verwenden: –

+0

Vielen Dank für Ihre Hilfe! Mein Code wird ausgeführt, ohne Fehler zu werfen, und behauptet, dass er erfolgreich funktioniert, aber ich habe noch keine Datenaktualisierungen auf BigQuery gesehen. Ich nehme an, es dauert wahrscheinlich ein paar Minuten, um die Änderung zu registrieren, aber ich habe gewartet und mich erfrischt ohne Glück, also ist es schwer zu sagen, ob alles funktioniert. Irgendein Einblick darauf, was das Problem wäre, wenn mein Code sich nicht beschweren würde und doch nicht wirklich seine Arbeit macht? Ich habe den Fortschritt protokolliert, also sehe ich, dass Ihre Funktionen ausgeführt werden ... Idk vielleicht in einer Stunde BigQuery wird zeigen, dass es wirklich funktioniert hat. –

Verwandte Themen