Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 如何将BigQuery表模式导出为DDL_Google Cloud Platform_Google Bigquery_Ddl_Create Table - Fatal编程技术网

Google cloud platform 如何将BigQuery表模式导出为DDL

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 或者您

我需要使用与现有表中相同的模式创建BigQuery表。 在标准MySql中有SHOW CREATE TABLE,BigQuery是否也有类似的功能

。。。使用与现有表中相同的架构创建BigQuery表

您可以在新表中使用下面的技巧,因为目标技巧是使用WHERE FALSE,这使得下面的查询在保留模式的同时不需要花费任何成本,输出中只有0行

#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;