我的产品环境中有一个分区表(具有日期分区一年),我想将所有这些分区复制到开发环境中的另一个分区表中。我该怎么做呢?
我尝试了此命令,但一次只能复制一个分区。
bq cp -a':._ 20180605':。
我可以一次从逗号分隔的源表中选择多个表,但是如果我没有按如下所述指定目标表的日期分区,则它将创建一个具有相同名称的新表,而不是附加先前创建的分区表中的数据
bq cp -a':._ 20180605':。
如何一次性将所有分区从源表复制到目标表?有任何查询或bq命令可以执行此操作吗?
答案 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]'
我希望这会有所帮助。