在Google的Big查询中,有没有一种方法可以克隆(仅复制结构)没有数据的表?
bq cp似乎没有复制没有数据的结构的选项。 具有过滤器(例如“ 1 = 2”)的“将表创建为选择(CTAS)”确实会创建没有数据的表。但是,它不会复制分区/集群属性。
答案 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
通过以下方式安装jq:bq 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
答案 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
。
请参阅下面链接的文档: