2015-09-22 2 views
8

Während unser Projekt wächst, haben wir irgendwann erkannt, dass wir neue Projekte erstellen und unseren Datensatz neu organisieren müssen. Ein Fall ist, dass wir einen Datensatz von anderen in ein anderes neues Projekt isolieren müssen. Ich weiß, dass ich es tun kann, indem ich Tabellen nacheinander über API kopiere und dann die alten lösche. Aber wenn es um mehr als tausend Tabellen geht, verbraucht es wirklich viel Zeit, da die Kopier-API als Job ausgeführt wird und Zeit braucht. Ist es möglich, nur die Referenz (oder den Pfad) eines Datensatzes zu ändern?Jede Funktion in BigQuery, die ein ganzes Dataset in einem anderen Projekt migrieren kann, ohne Kopierdaten auszuführen?

Follow-up Ich versuchte kopieren Tabellen mit Batch-Anfrage. Ich habe 200 OK in allen Anfragen, aber die Tabellen wurden einfach nicht kopiert. Ich frage mich, warum und wie man das wirkliche Ergebnis bekommt. Hier ist mein Code:

public async Task CopyTableToProjectInBatchAsync(IList<TableList.TablesData> fromTables, string toProjectId) 
    { 
     var request = new BatchRequest(BigQueryService); 
     foreach (var tableData in fromTables) 
     { 
      string fromDataset = tableData.TableReference.DatasetId; 
      string fromTableId = tableData.TableReference.TableId; 
      Logger.Info("copying table {0}...",tableData.Id); 
      request.Queue<JobReference>(CreateTableCopyRequest(fromDataset, fromTableId, toProjectId), 
      (content, error, i, message) => 
      { 
       Logger.Info("#content:\n" + content); 
       Logger.Info("#error:\n" + error); 
       Logger.Info("#i:\n" + i); 
       Logger.Info("#message:\n" + message); 
      }); 
     } 
     await request.ExecuteAsync(); 
    } 

    private IClientServiceRequest CreateTableCopyRequest(string fromDatasetId, string fromTableId, string toProjectId, 
     string toDatasetId=null, string toTableId=null) 
    { 
     if (toDatasetId == null) 
      toDatasetId = fromDatasetId; 
     if (toTableId == null) 
      toTableId = fromTableId; 
     TableReference sourceTableReference = new TableReference 
     { 
      ProjectId = _account.ProjectId, 
      DatasetId = fromDatasetId, 
      TableId = fromTableId 
     }; 
     TableReference targetTableReference = new TableReference 
     { 
      ProjectId = toProjectId, 
      DatasetId = toDatasetId, 
      TableId = toTableId 
     }; 
     JobConfigurationTableCopy copyConfig = new JobConfigurationTableCopy 
     { 
      CreateDisposition = "WRITE_TRUNCATE", 
      DestinationTable = targetTableReference, 
      SourceTable = sourceTableReference 
     }; 
     JobReference jobRef = new JobReference {JobId = GenerateJobID("copyTable"), ProjectId = _account.ProjectId}; 
     JobConfiguration jobConfig = new JobConfiguration {Copy = copyConfig}; 
     Job job = new Job {Configuration = jobConfig, JobReference = jobRef}; 

     return BigQueryService.Jobs.Insert(job, _account.ProjectId); 
    } 

Antwort

1

Nein, es gibt derzeit keine Bewegung oder Umbenennung in BigQuery. Die beste Möglichkeit, Ihre Daten zu verschieben, besteht darin, sie zu kopieren und das Original zu löschen.

Folgeantwort: Ihre Stapelanforderung erstellte die Kopieraufträge, aber Sie müssen warten, bis sie abgeschlossen sind, und dann das Ergebnis beobachten. Sie können die BigQuery-Webbenutzeroberfläche verwenden oder "bq ls -j" über die Befehlszeile ausführen, um die letzten Jobs anzuzeigen.

+0

ich oben – foxwendy

+0

auch ein Follow-up setzen, denken Sie, ist es möglich, eine Funktion in der Zukunft sein? – foxwendy

+0

und mein Verständnis ist, dass die Kopie funktioniert nur, wenn Quell- und Zieldatensätze den gleichen Speicherort haben –

4

Es gibt keine eingebaute Funktion, aber ich habe geholfen, ein Tool zu schreiben, das wir für Sie öffnen: https://github.com/uswitch/big-replicate.

Sie können Tabellen zwischen Projekten oder Datasets (innerhalb desselben Projekts) synchronisieren/kopieren. Die meisten Details sind in dem Projekt README aber als Referenz sieht es ein wenig wie:

java -cp big-replicate-standalone.jar \ 
    uswitch.big_replicate.sync \ 
    --source-project source-project-id \ 
    --source-dataset 98909919 \ 
    --destination-project destination-project-id \ 
    --destination-dataset 98909919 

Sie Optionen festlegen, die steuern, wie viele Tabellen zu kopieren, wie viele Arbeitsplätze gleichzeitig laufen und wo die Zwischendaten zu speichern, im Cloudspeicher. Das Ziel-Dataset muss bereits vorhanden sein, aber das bedeutet, dass Sie Daten auch zwischen Standorten kopieren können (USA, EU, Asien usw.).

Binaries sind auf CircleCI gebaut und veröffentlicht auf GitHub releases.

2

Ein kurzer Shell-Skript, das kopiert alle Tabellen aus einem Datensatz zu einem anderen Daten-Set:

export SOURCE_DATASET=$1 # project1:dataset 
export DEST_PREFIX=$2 # project2:dataset2.any_prefix_ 
for f in `bq ls $SOURCE_DATASET |grep TABLE | awk '{print $1}'` 
do 
    export CP_COMMAND="bq cp $SOURCE_DATASET.$f $DEST_PREFIX$f" 
    echo $CP_COMMAND 
    echo `$CP_COMMAND` 
done 
Verwandte Themen