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);
}
ho messo un follow-up sopra – foxwendy
Inoltre, pensi che sia possibile essere una caratteristica in futuro? – foxwendy
e la mia comprensione è che la copia funzionerà solo se i set di dati di origine e destinazione hanno la stessa posizione dei dati –