Copy table structure alone in Bigquery

This is possible with the BQ CLI.

First download the schema of the existing table:

bq show --format=prettyjson project:dataset.table | jq '.schema.fields' > table.json

Then, create a new table with the provided schema and required partitioning:

bq mk \
  --time_partitioning_type=DAY \
  --time_partitioning_field date_field \
  --require_partition_filter \
  --table dataset.tablename \
  table.json

See more info on bq mk options: https://cloud.google.com/bigquery/docs/tables

Install jq with: npm install node-jq


BigQuery now supports CREATE TABLE LIKE explicitly for this purpose.

See documentation linked below:

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


If you want to clone structure of table along with partitioning/clustering properties w/o having need in knowing what exactly those partitioning/clustering properties - follow below steps:

Step 1: just copy your_table to new table - let's say your_table_copy. This will obviously copy whole table including all properties (including such like descriptions, partition's expiration etc. - which is very simple to miss if you will try to set them manually) and data. Note: copy is cost free operation

Step 2: To get rid of data in newly created table - run below query statement

SELECT * FROM `project.dataset.your_table_copy` LIMIT 0    

while running above make sure you set project.dataset.your_table_copy as destination table with 'Overwrite Table' as 'Write Preference'. Note: this is also cost free step (because of LIMIT 0)

You can easily do both above steps from within Web UI or Command Line or API or any client of your choice - whatever you are most comfortable with


You can use DDL and limit 0, but you need to express partitioning and clustering in the query as well

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