Grundsätzlich möchte ich Abfrageergebnisse aus BigQuery an eine vorhandene große Abfragetabelle anhängen, ohne über die Ergebnisse zu iterieren.
Bigquery Ergebnisse sind in List<TableRow>
.
BigQuery insertAll()
erfordert eine TableDataInsertAllRequest
die .setRows()
Methode hat aber diese Methode dauert nur List<TableDataInsertAllRequest.Rows>
so muss ich die List<TableRow>
iterieren aber da ich Ergebnisse mit vielen Zeilen ist dies ineffizient abfragt.
Also, wie konfiguriere ich eine Zieltabelle in der Abfrage?Anfügen großer Abfrageergebnisse an vorhandene Tabelle in Java Appengine
Antwort
Google-Unterstützung gab mir die Antwort. Durch die Verwendung einer asynchronen Abfrage kann die Zieltabelle wie folgt eingestellt werden.
JobConfigurationQuery queryConfig = new JobConfigurationQuery().setQuery(<querySql>);
queryConfig.setDestinationTable(<destination_table>);
queryConfig.setWriteDisposition("WRITE_APPEND");
Job job = new Job().setConfiguration(new JobConfiguration().setQuery(queryConfig));
bigquery.jobs().insert(projectId, job).execute();
Google-Unterstützung ist genial!
sieht aus wie es genau ist, was ist in meiner Antwort: o) –
Ja, aber diese Antwort ist vor allem für die bigquery Java-API-Wrapper;) – bitlukas
Werfen Sie einen Blick auf configuration.query Eigenschaft Jobs: insert API
Insbesondere - configuration.query.writeDisposition - gibt die Aktion an, die, wenn die Zieltabelle existiert bereits auftritt. In Ihrem Fall sollten Sie verwenden - WRITE_APPEND
aber Sie haben diese Ergebnisse bereits als Liste erhalten. in den Speicher geladen. Ich meine, welche Optimierung suchst du? Es ist kein Stream –
Die Optimierung ist, dass ich nicht einmal die Zeilen in den Speicher laden muss, indem Sie eine Zieltabelle beim Abfragen von BigQuery setzen. Dies ist mit asynchronen Abfragen möglich. – bitlukas
oh, ich verstehe. Ich suche nur nach Optimierungen für Tabelle append –