繁体   English   中英

将 BigQuery 表从一个项目导出到另一个项目

[英]Exporting BigQuery table from one project to another

我正在尝试将存储在 Google Cloud 项目 (Project1) 中的 BigQuery 表 (Table1) 复制到另一个 Google Cloud 项目 (Project2)。 该表按 TB 的顺序排列。 最好的方法是什么,这样我就不必在本地导出表了? 我应该将表从 Project1 导出到 Google Cloud Storage,然后再导出到 Project2 吗? 或者,还有更好的方法?

使用bq命令行工具将表从一个项目复制到另一个项目。 您可以查看以下示例命令

资源:

  • projectid123456789123
  • 数据集dataset1
  • table1

目的地:

  • projectid0987654321098
  • 数据集dataset2
  • table2

命令:

bq cp 123456789123:dataset1.table1 0987654321098:dataset2.table2

如果Source和Destination位于同一位置 - 您甚至可以在不同项目之间使用Copy Table

使用python的大规模复制快速脚本

这使用上面给出的命令@ kanishka-mohaia,返回格式为json

每个数据集的每个表都将复制到目标

此脚本不负责创建数据集和表

import json
import time
from subprocess import check_output

data_sets = json.loads(check_output("bq ls --format=json", shell=True).decode())

FROM_PROJECT = ''
TO_PROJECT = ''

for ds_item in data_sets:
    dataset = ds_item['datasetReference']['datasetId'].strip()

    tables = json.loads(
        check_output(f"bq ls --format=json {dataset}", shell=True).decode())

    for table_item in tables:
        table = table_item['tableReference']['tableId']
        print(f"Table = {dataset}.{table}")

        command = f'echo y | bq cp {FROM_PROJECT}:{dataset}.{table} ' \
                  f'{TO_PROJECT}:{dataset}.{table}'

        print(command)

        try:
            result = check_output(command, shell=True)

        except Exception as e:
            continue

        print(result)

        time.sleep(5)

如果您想将数据集从一个项目复制到另一个项目,则可以使用以下命令进行传输作业:

bq mk --transfer_config --project_id=[PROJECT_ID] --data_source=[DATA_SOURCE] --target_dataset=[DATASET] --display_name=[NAME] --params='[PARAMETERS]'

其中PROJECT_ID :目标PROJECT_ID DATA_SOURCE :cross_region_copy DATASET :目标数据集NAME :你的工作的显示名称。 PARAMETERS :可以定义源项目ID,源数据集ID和其他参数(覆盖目标表等)

您可以通过此链接获取详细说明。

这是在 bash 中编写的解决方案,它允许您动态插入源项目、目标项目和要执行的复制限制。 您可以在云 shell 中使用它,因为已经安装了 gcloud 依赖项。 如果 JQ 没有在您的环境中运行,请执行安装它的命令。

#!/bin/bash

read -p "Insert origin project: " ORIGIN_PROJECT
read -p "Insert destination project: " DESTINATION_PROJECT
read -e -p "Set limit copy: " -i 100 COPYLIMIT

declare -a RESPONSE=()

if [ -z "$ORIGIN_PROJECT" ] ; then
  RESPONSE+=("ERROR: The origin project is mandatory.")
fi

if [ -z "$DESTINATION_PROJECT" ] ; then
  RESPONSE+=("ERROR: The destination project is mandatory.")
fi

if [ ${#RESPONSE[@]} -ne 0 ] ; then
  printf '%s\n' "${RESPONSE[@]}"
  exit 1;
fi

unset RESPONSE

gcloud config set project "$ORIGIN_PROJECT"

tablecopy() {
    local project=$(jq -rc .tableReference.projectId <<< $1)
    local dataset=$(jq -rc .tableReference.datasetId <<< $1)
    local dataset_table=$(jq -rc .tableReference.tableId <<< $1)

    bq cp --quiet --clone=true --force=true "$project:$dataset.$dataset_table" "$DESTINATION_PROJECT:$dataset.$dataset_table" > /dev/null

    echo "│    ├── $dataset_table " $([[ $? -ne 0 ]] && echo "not copied" || echo "ok")

    return 0
}

datasetcopy() {
  local project=$(jq -rc .datasetReference.projectId <<< $1)
  local dataset=$(jq -rc .datasetReference.datasetId <<< $1)
  local dataset_location=$(jq -rc .location <<< $1)

  bq --quiet --headless=true --location="$dataset_location" --project_id "$DESTINATION_PROJECT" mk "$dataset" > /dev/null

  echo "├── $dataset"

  readarray -t TABLES < <(bq ls --format=json --all=true --max_results="$COPYLIMIT" "$project:$dataset" | jq -rc .[])
  for table in "${TABLES[@]}"; do
    tablecopy "$table"
  done

  echo "│";

  return 0
}

echo "Start migration of first $COPYLIMIT datasets"

readarray -t DATASET < <(bq ls --format=json --all=true --max_results="$COPYLIMIT" | jq -rc .[])
for object in "${DATASET[@]}"; do
  datasetcopy "$object"
done

exit 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM