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);
}
ich oben – foxwendy
auch ein Follow-up setzen, denken Sie, ist es möglich, eine Funktion in der Zukunft sein? – foxwendy
und mein Verständnis ist, dass die Kopie funktioniert nur, wenn Quell- und Zieldatensätze den gleichen Speicherort haben –