将多个分区表从源项目复制到BigQuery中目标项目中的另一个分区表

时间:2020-01-09 23:52:42

标签: google-cloud-platform google-bigquery

我的产品环境中有一个分区表(具有日期分区一年),我想将所有这些分区复制到开发环境中的另一个分区表中。我该怎么做呢?

我尝试了此命令,但一次只能复制一个分区。

bq cp -a':._ 20180605':。

我可以一次从逗号分隔的源表中选择多个表,但是如果我没有按如下所述指定目标表的日期分区,则它将创建一个具有相同名称的新表,而不是附加先前创建的分区表中的数据

bq cp -a':._ 20180605':。

如何一次性将所有分区从源表复制到目标表?有任何查询或bq命令可以执行此操作吗?

1 个答案:

答案 0 :(得分:0)

根据Copying multiple source tables的文档:“必须将源表指定为以逗号分隔的列表。”

因此,我可以建议您3种选择:

首先: 如果分区表包含具有分区日期的列,则可以创建bq命令来选择所需的分区日期,将列表保存在文件中并执行它与bash命令。因此,您将能够将所有表附加到所需的目标表。语法如下:

bq query --format=csv --nouse_legacy_sql '
SELECT
  CONCAT('bq cp -a <sourceproj>:<dataset>.<table>$', partition_name, ' <testproj>:<dataset>.Partitioned_Destination_Table')
FROM (
  SELECT
    DISTINCT FORMAT_DATETIME('%Y%m%d',
      CAST(_PARTITIONDATE AS datetime)) partition_name
  FROM
    `<sourceproj>.<dataset>.<table>`
  WHERE
    _PARTITIONTIME >= "start_date"
    AND _PARTITIONTIME < "end_date")' > output.csv

然后,使用所有bq复制命令执行文件。

bash output.csv

您可以了解有关bq命令行here的更多信息。

第二个: 在shell脚本中,列出所有时间戳分区并进行查询,然后将每个表追加到已创建的分区目标表中。语法为:

tables=("20200107"  "20200106"  "20200105"  "20200104")

   for val in ${tables[*]}; do
        bq cp -a <project1>:<dataset1>.<table1_$val> <project2>:<dataset2>.<Partitioned_Destination_Table>
   done

第三步: 如果数据集仅包含要复制的表,则可以复制整个数据集,可以进一步了解here,它将如下所示:

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

我希望这会有所帮助。

相关问题