2015-09-22 9 views
8

Mentre il nostro progetto cresce, ad un certo punto ci siamo resi conto che abbiamo bisogno di creare nuovi progetti e riorganizzare il nostro set di dati. Un caso è che dobbiamo isolare un set di dati dagli altri in un altro nuovo progetto. So che posso farlo copiando i tavoli uno a uno tramite API e poi cancellando quelli vecchi. Ma quando si tratta di oltre un migliaio di tabelle, si consuma molto tempo poiché l'API di copia viene eseguita come lavoro e richiede tempo. È possibile modificare semplicemente il riferimento (o il percorso) di un set di dati?Qualsiasi funzione di BigQuery che può migrare un intero set di dati in un altro progetto senza eseguire i dati di copia?

Follow-up Ho provato a copiare le tabelle utilizzando la richiesta batch. Ho ricevuto 200 OK in tutte le richieste, ma le tabelle non sono state copiate. Mi chiedo perché e come ottenere il risultato reale. Ecco il mio codice:

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

risposta

1

No, al momento non ci sono operazioni di spostamento o ridenominazione in BigQuery. Il modo migliore per spostare i dati è copiarlo e cancellare l'originale.

Risposta di follow-up: la richiesta batch ha creato i lavori di copia, ma è necessario attendere il loro completamento e quindi osservare il risultato. È possibile utilizzare l'interfaccia utente Web di BigQuery o eseguire "bq ls -j" dalla riga di comando per visualizzare i lavori recenti.

+0

ho messo un follow-up sopra – foxwendy

+0

Inoltre, pensi che sia possibile essere una caratteristica in futuro? – foxwendy

+0

e la mia comprensione è che la copia funzionerà solo se i set di dati di origine e destinazione hanno la stessa posizione dei dati –

4

Non esiste una funzionalità incorporata, ma ho aiutato a scrivere uno strumento che abbiamo open source che lo farà per voi: https://github.com/uswitch/big-replicate.

Permette di sincronizzare/copiare tabelle tra progetti o set di dati (all'interno dello stesso progetto). La maggior parte dei dettagli sono nel progetto del README ma per riferimento sembra un po 'come:

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 

È possibile impostare opzioni che controllano il numero di tabelle di copiare, quanti posti di lavoro eseguiti simultaneamente e dove memorizzare i dati intermedi in Cloud Storage. Il set di dati di destinazione deve già esistere ma questo significa che sarete in grado di copiare i dati anche tra le posizioni (Stati Uniti, UE, Asia ecc.).

I file binari sono creati su CircleCI e pubblicati su GitHub releases.

2

Un breve script di shell che copia tutte le tabelle da un set di dati a un altro insieme di dati:

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