BigQuery 中的任何功能都可以在另一个项目 w/o 执行复制数据时迁移整个数据集?

Any feature in BigQuery that can migrate a whole dataset in another project w/o executing copy data?

当我们的项目增长时,在某些时候我们意识到我们需要创建新项目并重新组织我们的数据集。一种情况是我们需要将一个数据集与其他数据集隔离到另一个新项目中。我知道我可以通过 API 一张一张地复制表格,然后删除旧的。但是上千张表的时候,真的很耗时间,因为复制api是作为一个作业来执行的,很费时间。是否可以只更改数据集的引用(或路径)?

跟进 我尝试使用批处理请求复制表。我在所有请求中都得到了 200 OK,但是表格没有被复制。我想知道为什么以及如何获得真正的结果。这是我的代码:

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

不,目前 BigQuery 中没有移动或重命名操作。移动数据的最佳方法是复制它并删除原始数据。

后续回答:您的批处理请求创建了复制作业,但您需要等待它们完成,然后再观察结果。您可以从命令行使用 BigQuery 网络 UI 或 运行 "bq ls -j" 查看最近的作业。

没有内置功能,但我帮助编写了一个我们开源的工具,可以为您执行此操作:https://github.com/uswitch/big-replicate

它会让你 synchronise/copy 项目或数据集之间的表(在同一项目内)。大多数细节都在项目的 README 中,但作为参考,它看起来有点像:

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

您可以设置选项来控制要复制的表数量、并发作业数量 运行 以及中间数据在云存储中的存储位置。目标数据集必须已经存在,但这意味着您也可以在不同位置(美国、欧盟、亚洲等)之间复制数据。

二进制文件基于 CircleCI and published to GitHub releases

一个简短的 shell 脚本,它将所有表从一个数据集复制到另一个数据集:

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

您可以先将BigQuery数据集复制到新项目中,再删除原来的数据集。

复制数据集UI类似于复制table。只需单击源数据集中的 "copy dataset" 按钮,然后在弹出的表单中指定目标数据集。请参见下面的屏幕截图。查看 public documentation 了解更多用例。

复制数据集按钮

复制数据集形式