在Bigquery中单独复制表结构

时间:2019-01-05 16:38:54

标签: google-bigquery

在Google的Big查询中,有没有一种方法可以克隆(仅复制结构)没有数据的表?

bq cp似乎没有复制没有数据的结构的选项。 具有过滤器(例如“ 1 = 2”)的“将表创建为选择(CTAS)”确实会创建没有数据的表。但是,它不会复制分区/集群属性。

6 个答案:

答案 0 :(得分:4)

您可以使用DDL并限制为0,但是您还需要在查询中表示分区和聚类

#standardSQL
 CREATE TABLE mydataset.myclusteredtable
 PARTITION BY DATE(timestamp)
 CLUSTER BY
   customer_id
 AS SELECT * FROM mydataset.myothertable LIMIT 0

答案 1 :(得分:4)

这可以通过BQ CLI进行。

首先下载现有表的架构:

Date

然后,使用提供的架构和所需的分区创建一个新表:

List<string> columnDates = dt.Columns.Cast<DataColumn>()
               .Select(cols => cols.ColumnName.Split(" ").First())
               .ToList();

查看有关bq show --format=prettyjson project:dataset.table | jq '.schema.fields' > table.json 选项的更多信息:https://cloud.google.com/bigquery/docs/tables

通过以下方式安装jqbq mk \ --time_partitioning_type=DAY \ --time_partitioning_field date_field \ --require_partition_filter \ --table dataset.tablename \ table.json

答案 2 :(得分:2)

您可以按照建议使用BigQuery API运行选择,这将返回空结果并设置分区和集群字段。

这是一个示例(仅分区但群集也可以工作)

curl --request POST \
  'https://www.googleapis.com/bigquery/v2/projects/myProject/jobs' \
  --header 'Authorization: Bearer [YOUR_BEARER_TOKEN]' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{"configuration":{"query":{"query":"SELECT * FROM `Project.dataset.audit` WHERE 1 = 2","timePartitioning":{"type":"DAY"},"destinationTable":{"datasetId":"datasetId","projectId":"projectId","tableId":"test"},"useLegacySql":false}}}' \
  --compressed

结果 enter image description here

答案 3 :(得分:1)

如果要克隆表的结构以及不需要了解确切的分区/集群属性的分区/集群属性,请执行以下步骤:

步骤1 :只需将SELECT Instrument.Name AS Name, Status.Name AS Status, Operation.Time AS Time, FROM Operation INNER JOIN Instrument ON Instrument.Id = Operation.InstrumentId INNER JOIN Status ON Status.Id = Operation.StatusId WHERE Instrument.Name = ?; 复制到新表中-假设your_table。显然,这将复制整个表,包括所有属性(包括描述,分区的到期时间等-如果您尝试手动设置它们,很容易错过)和数据。注意:复制是免费的操作

第2步:要清除新创建的表中的数据-在查询语句下运行

your_table_copy

在上面运行时,请确保将SELECT * FROM `project.dataset.your_table_copy` LIMIT 0 设置为目标表,并将“覆盖表”设置为“写首选项”。注意:这也是免费的步骤(因为LIMIT 0)

您可以在Web UI或命令行或API或您选择的任何客户端中轻松完成上述两个步骤,无论您最喜欢什么

答案 4 :(得分:0)

最后,我使用下面的python脚本检测模式/分区/集群属性,以重新创建(克隆)不包含数据的集群表。我希望我们可以从bigquery中获得开箱即用的功能来克隆表结构,而无需诸如此类的脚本。

import commands
import json

BQ_EXPORT_SCHEMA = "bq show --schema --format=prettyjson %project%:%dataset%.%table% > %path_to_schema%"
BQ_SHOW_TABLE_DEF="bq show --format=prettyjson %project%:%dataset%.%table%"
BQ_MK_TABLE = "bq mk --table --time_partitioning_type=%partition_type% %optional_time_partition_field% --clustering_fields %clustering_fields% %project%:%dataset%.%table% ./%cluster_json_file%"


def create_table_with_cluster(bq_project, bq_dataset, source_table, target_table):

    cmd = BQ_EXPORT_SCHEMA.replace('%project%', bq_project)\
        .replace('%dataset%', bq_dataset)\
        .replace('%table%', source_table)\
        .replace('%path_to_schema%', source_table)
    commands.getstatusoutput(cmd)

    cmd = BQ_SHOW_TABLE_DEF.replace('%project%', bq_project)\
        .replace('%dataset%', bq_dataset)\
        .replace('%table%', source_table)
    (return_value, output) = commands.getstatusoutput(cmd)

    bq_result = json.loads(output)

    clustering_fields = bq_result["clustering"]["fields"]
    time_partitioning = bq_result["timePartitioning"]
    time_partitioning_type = time_partitioning["type"]
    time_partitioning_field = ""
    if "field" in time_partitioning:
        time_partitioning_field = "--time_partitioning_field " + time_partitioning["field"]

    clustering_fields_list = ",".join(str(x) for x in clustering_fields)

    cmd = BQ_MK_TABLE.replace('%project%', bq_project)\
        .replace('%dataset%', bq_dataset)\
        .replace('%table%', target_table)\
        .replace('%cluster_json_file%', source_table)\
        .replace('%clustering_fields%', clustering_fields_list)\
        .replace('%partition_type%', time_partitioning_type)\
        .replace('%optional_time_partition_field%', time_partitioning_field)
    commands.getstatusoutput(cmd)


create_table_with_cluster('test_project', 'test_dataset', 'source_table', 'target_table')

答案 5 :(得分:0)

BigQuery 现在为此明确支持 CREATE TABLE LIKE

请参阅下面链接的文档:

https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_table_like