Google cloud platform 如何将BigQuery表模式导出为DDL
我需要使用与现有表中相同的模式创建BigQuery表。 在标准MySql中有SHOW CREATE TABLE,BigQuery是否也有类似的功能 。。。使用与现有表中相同的架构创建BigQuery表 您可以在新表中使用下面的技巧,因为目标技巧是使用WHERE FALSE,这使得下面的查询在保留模式的同时不需要花费任何成本,输出中只有0行Google cloud platform 如何将BigQuery表模式导出为DDL,google-cloud-platform,google-bigquery,ddl,create-table,Google Cloud Platform,Google Bigquery,Ddl,Create Table,我需要使用与现有表中相同的模式创建BigQuery表。 在标准MySql中有SHOW CREATE TABLE,BigQuery是否也有类似的功能 。。。使用与现有表中相同的架构创建BigQuery表 您可以在新表中使用下面的技巧,因为目标技巧是使用WHERE FALSE,这使得下面的查询在保留模式的同时不需要花费任何成本,输出中只有0行 #standardSQL SELECT * FROM `project.dataset.existing_table` WHERE FALSE 或者您
#standardSQL
SELECT *
FROM `project.dataset.existing_table`
WHERE FALSE
或者您可以在CTAS CREATE TABLE中使用上述语句作为DDL的SELECT类型,与MySQL中的SHOW CREATE TABLE没有任何相似之处,但使用UDF可以在数据集中生成表的DDL语句 使用以下脚本并确保将“mydataset”替换为您的。您甚至可以添加WHERE谓词以仅输出特定的表DDL 复制所需表的输出并将其粘贴到新的Compose查询窗口中,并为其指定一个新表名
CREATE TEMP FUNCTION MakePartitionByExpression(
column_name STRING, data_type STRING
) AS (
IF(
column_name = '_PARTITIONTIME',
'DATE(_PARTITIONTIME)',
IF(
data_type = 'TIMESTAMP',
CONCAT('DATE(', column_name, ')'),
column_name
)
)
);
CREATE TEMP FUNCTION MakePartitionByClause(
columns ARRAY<STRUCT<column_name STRING, data_type STRING, is_nullable STRING, is_partitioning_column STRING, clustering_ordinal_position INT64>>
) AS (
IFNULL(
CONCAT(
'PARTITION BY ',
(SELECT MakePartitionByExpression(column_name, data_type)
FROM UNNEST(columns) WHERE is_partitioning_column = 'YES'),
'\n'),
''
)
);
CREATE TEMP FUNCTION MakeClusterByClause(
columns ARRAY<STRUCT<column_name STRING, data_type STRING, is_nullable STRING, is_partitioning_column STRING, clustering_ordinal_position INT64>>
) AS (
IFNULL(
CONCAT(
'CLUSTER BY ',
(SELECT STRING_AGG(column_name, ', ' ORDER BY clustering_ordinal_position)
FROM UNNEST(columns) WHERE clustering_ordinal_position IS NOT NULL),
'\n'
),
''
)
);
CREATE TEMP FUNCTION MakeNullable(data_type STRING, is_nullable STRING)
AS (
IF(not STARTS_WITH(data_type, 'ARRAY<') and is_nullable = 'NO', ' NOT NULL', '')
);
CREATE TEMP FUNCTION MakeColumnList(
columns ARRAY<STRUCT<column_name STRING, data_type STRING, is_nullable STRING, is_partitioning_column STRING, clustering_ordinal_position INT64>>
) AS (
IFNULL(
CONCAT(
'(\n',
(SELECT STRING_AGG(CONCAT(' ', column_name, ' ', data_type, MakeNullable(data_type, is_nullable)), ',\n')
FROM UNNEST(columns)),
'\n)\n'
),
''
)
);
CREATE TEMP FUNCTION MakeOptionList(
options ARRAY<STRUCT<option_name STRING, option_value STRING>>
) AS (
IFNULL(
CONCAT(
'OPTIONS (\n',
(SELECT STRING_AGG(CONCAT(' ', option_name, '=', option_value), ',\n') FROM UNNEST(options)),
'\n)\n'),
''
)
);
WITH Components AS (
SELECT
CONCAT('`', table_catalog, '.', table_schema, '.', table_name, '`') AS table_name,
ARRAY_AGG(
STRUCT(column_name, data_type, is_nullable, is_partitioning_column, clustering_ordinal_position)
ORDER BY ordinal_position
) AS columns,
(SELECT ARRAY_AGG(STRUCT(option_name, option_value))
FROM mydataset.INFORMATION_SCHEMA.TABLE_OPTIONS AS t2
WHERE t.table_name = t2.table_name) AS options
FROM mydataset.INFORMATION_SCHEMA.TABLES AS t
LEFT JOIN mydataset.INFORMATION_SCHEMA.COLUMNS
USING (table_catalog, table_schema, table_name)
WHERE table_type = 'BASE TABLE'
GROUP BY table_catalog, table_schema, t.table_name
)
SELECT
CONCAT(
'CREATE OR REPLACE TABLE ',
table_name,
'\n',
MakeColumnList(columns),
MakePartitionByClause(columns),
MakeClusterByClause(columns),
MakeOptionList(options))
FROM Components
有关更多信息,请检查->使用信息\u架构获取表元数据
我看到两个删除的答案,这是好的。这里发生了什么事?删除的答案是好的。@Stéphane Fréchette-我明白为什么删除了你的第一个答案-但是为什么删除了你的第二个答案?我认为你的警惕性很好。我已经删除了我的答案,我们现在可以走了!有一点值得一提的是,它还计算_PARTITIONTIME列并将其添加到create语句中,然而BQ不允许为用户创建这样的列
SELECT
table_name, ddl
FROM
`bigquery-public-data`.census_bureau_usa.INFORMATION_SCHEMA.TABLES;