使用数据定义语言语句

通过数据定义语言 (DDL) 语句,您可以使用标准 SQL 查询语法创建和修改 BigQuery 资源。目前,您可以在 BigQuery 中使用 DDL 命令执行以下操作:

CREATE TABLE 语句

如需在 BigQuery 中创建表,请使用 CREATE TABLE DDL 语句。

语法

{CREATE TABLE | CREATE TABLE IF NOT EXISTS | CREATE OR REPLACE TABLE}
table_name
[(
  column_name column_schema[, ...]
)]
[PARTITION BY partition_expression]
[CLUSTER BY clustering_column_list]
[OPTIONS(table_option_list)]
[AS query_statement]

其中:

{CREATE TABLE | CREATE TABLE IF NOT EXISTS | CREATE OR REPLACE TABLE} 是下述语句之一:

  • CREATE TABLE - 创建新表。
  • CREATE TABLE IF NOT EXISTS - 仅当指定的数据集中不存在要创建的表时才创建此表。
  • CREATE OR REPLACE TABLE - 在指定数据集中创建表并替换具有相同名称的现有表。

CREATE TABLE 语句必须符合以下规则:

  • 只能使用一个 CREATE 语句。
  • 必须存在列列表和/或 as query_statement 子句。
  • 当列列表和 as query_statement 子句都存在时,BigQuery 会忽略 as query_statement 子句中的名称,并按位置匹配列和列列表。
  • 存在 as query_statement 子句但不存在列列表时,BigQuery 会根据 as query_statement 子句确定列名称和类型。
  • 必须通过列列表或 as query_statement 子句指定列名称。
  • 禁止使用重复的列名称。

table_name

table_name 是您要创建的表的名称。每个数据集的表名称必须唯一。表名称可以:

  • 包含最多 1024 个字符
  • 由字母(大写或小写)、数字和下划线组成

column_namecolumn_schema

(column_name column_schema[, ...]) 以英文逗号分隔列表的形式提供表的架构信息

  • column_name 是列的名称。列名称要求:
    • 只能包含字母(a-z、A-Z)、数字 (0-9) 或下划线 (_)
    • 必须以字母或下划线开头
    • 最多包含 128 个字符
  • column_schema数据类型相似,但对于 ARRAY 以外的类型,支持视需要施加 NOT NULL 限制。column_schema 还支持顶级列与 STRUCT 字段的选项。
column_schema :=
   {simple_type [NOT NULL] |
    STRUCT<field_list> [NOT NULL] |
    ARRAY<array_element_schema>}
   [OPTIONS(column_option_list)]

field_list := field_name column_schema [, ...]

array_element_schema := {simple_type | STRUCT<field_list>} [NOT NULL]

simple_type 是除 STRUCTARRAY 之外的任何受支持的数据类型

field_name 是结构体字段的名称。结构体字段名称具有与列名称相同的限制。

当列或字段存在 NOT NULL 限制时,按 REQUIRED 模式创建列或字段。相反,没有 NOT NULL 限制时,按 NULLABLE 模式创建列或字段。

ARRAY 类型的列和字段不支持 NOT NULL 修饰符。例如,ARRAY<INT64> NOT NULLcolumn_schema 无效,因为 ARRAY 列具有 REPEATED 模式、可为空,但不可为 NULL。无论是否指定 NOT NULL 限制,表中的数组元素都不能为 NULL。例如,ARRAY<INT64> 等效于 ARRAY<INT64 NOT NULL>

表的 column_schemaNOT NULL 特性不会通过对表的查询来传播。例如,如果表 T 包含声明为 x INT64 NOT NULL 的列,CREATE TABLE dataset.newtable AS SELECT x FROM T 会创建名为 dataset.newtable 的表,其中 xNULLABLE

column_schema 只能在 CREATE TABLE 语句的列定义列表中使用,不能在表达式中作为类型使用。例如,CAST(1 AS INT64 NOT NULL) 是无效的。

partition_expression

PARTITION BY 是控制表分区的可选子句。 partition_expression 表达式用于确定如何对表进行分区。分区表达式可包含以下值:

  • PARTITION BY DATE(_PARTITIONTIME) - 使用 _PARTITIONTIME pseudo column 伪列中基于日期的时间戳对表进行分区。此语法只支持用于不带 AS query_statement 子句的 CREATE TABLE
  • PARTITION BY DATE(<timestamp_column>) - 使用 TIMESTAMP 列的日期对表进行分区
  • PARTITION BY <date_column> - 使用 DATE的日期对表进行分区

clustering_column_list

CLUSTER BY 是控制表聚簇的可选子句。 clustering_column_list 为逗号分隔的列表,用于确定如何对该表进行聚簇。聚簇列列表最多可包含 4 个聚簇列。

table_option_list

可通过选项列表设置标签和到期时间等表选项。可使用逗号分隔列表包括多个选项。

请按以下格式指定表选项列表:

NAME=VALUE, ...

NAMEVALUE 必须是下述组合之一:

NAME VALUE 详细信息
expiration_timestamp TIMESTAMP

示例:expiration_timestamp=TIMESTAMP "2020-01-01 00:00:00 UTC"

此属性等效于 expirationTime 表资源属性。

partition_expiration_days

FLOAT64

示例:partition_expiration_days=7

此属性等效于 timePartitioning.expirationMs 表资源属性,但单位是天而非毫秒。一天相当于 8640 万毫秒(即 24 小时)。

只能对分区表设置此属性。

require_partition_filter

BOOL

示例:require_partition_filter=true

此属性等效于 timePartitioning.requirePartitionFilter 表资源属性。

只能对分区表设置此属性。

kms_key_name

STRING

示例:kms_key_name="projects/project_id/locations/location/keyRings/keyring/cryptoKeys/key"

此属性等效于 encryptionConfiguration.kmsKeyName 表资源属性。

请查看有关使用 Cloud KMS 密钥保护数据的详细信息。

friendly_name

STRING

示例:friendly_name="my_table"

此属性等效于 friendlyName 表资源属性。

description

STRING

示例:description="a table that expires in 2020"

此属性等效于 description 表资源属性。

labels

ARRAY<STRUCT<STRING, STRING>>

示例:labels=[("org_unit", "development")]

此属性等效于 labels 表资源属性。

VALUE 是一个常量表达式,它只包含字面量、查询参数和标量函数。如果常量表达式的计算结果为 null,则忽略对应的 NAME 选项。

常量表达式不得包含以下内容:

  • 对表的引用
  • 子查询和 SQL 语句,如 SELECTCREATEUPDATE
  • 用户定义的函数、聚合函数或分析函数
  • 以下标量函数:
    • ARRAY_TO_STRING
    • REPLACE
    • REGEXP_REPLACE
    • RAND
    • FORMAT
    • LPAD
    • RPAD
    • REPEAT
    • SESSION_USER
    • GENERATE_ARRAY
    • GENERATE_DATE_ARRAY

column_option_list

通过 column_schema 中的 column_option_list,您可以指定可选的列或字段选项。列选项与表选项的语法和要求相同,但包含的 NAMEVALUE 列表不同:

NAME VALUE 详细信息
description

STRING

示例:description="a unique id"

此属性等效于 schema.fields[].description 表资源属性。

query_statement

AS query_statement 子句指定应用于创建表的查询。如需了解受支持的 query_statement 形式,请参阅 SQL 语法参考

已知限制:

  • 无法利用查询结果创建提取时间分区表。请改为使用 CREATE TABLE DDL 语句来创建表,然后使用 INSERT DML 语句向其中插入数据。
  • 无法使用 OR REPLACE 修饰符将表替换为使用不同种类的分区。请先使用 DROP 删除表,然后使用 CREATE TABLE ... AS SELECT ... 语句来重新创建表。

CREATE TABLE 示例

创建新表

CREATE TABLE DDL 语句会用指定选项创建表。如果数据集内存在表名称,会返回以下错误:

Already Exists: project_id:dataset.table

以下示例在 mydataset 中创建名为 newtable 的分区表。如果您未配置默认项目,请按以下格式将其添加到数据集名称之前:`project_id.dataset.table`(包括反引号);例如 `myproject.mydataset.newtable`

该表利用以下 partition_expression 对表进行分区:PARTITION BY DATE(_PARTITIONTIME)。此表达式使用 _PARTITIONTIME 伪列中基于日期的时间戳对表进行分区。

表架构中包含两列:

  • x — 整数,带有“可选 INTEGER 字段”描述
  • y - 包含 2 列的 STRUCT:

    • a - 一组字符串,带有“重复的字符串字段”描述
    • b - 布尔值

表选项列表指定了以下内容:

  • 表到期时间 - 世界协调时间 (UTC) 2020 年 1 月 1 日 00:00:00
  • 分区到期时间 - 1 天
  • 说明 - 于 2020 年到期的表
  • 标签 - org_unit = development

如需使用 DDL 创建新表,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     CREATE TABLE mydataset.newtable
     (
       x INT64 OPTIONS(description="An optional INTEGER field"),
       y STRUCT<
         a ARRAY<STRING> OPTIONS(description="A repeated STRING field"),
         b BOOL
       >
     )
     PARTITION BY DATE(_PARTITIONTIME)
     OPTIONS(
       expiration_timestamp=TIMESTAMP "2020-01-01 00:00:00 UTC",
       partition_expiration_days=1,
       description="a table that expires in 2020, with each partition living for 24 hours",
       labels=[("org_unit", "development")]
     )
     

  4. 点击运行。查询完成后,该表将显示在资源窗格中。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     CREATE TABLE mydataset.newtable
     (
       x INT64 OPTIONS(description="An optional INTEGER field"),
       y STRUCT<
         a ARRAY<STRING> OPTIONS(description="A repeated STRING field"),
         b BOOL
       >
     )
     PARTITION BY DATE(_PARTITIONTIME)
     OPTIONS(
       expiration_timestamp=TIMESTAMP "2020-01-01 00:00:00 UTC",
       partition_expiration_days=1,
       description="a table that expires in 2020, with each partition living for 24 hours",
       labels=[("org_unit", "development")]
     )
     

  4. 点击 Run query。查询完成后,该表将显示在导航窗格中。

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
CREATE TABLE mydataset.newtable
(
  x INT64 OPTIONS(description="An optional INTEGER field"),
  y STRUCT<
    a ARRAY<STRING> OPTIONS(description="A repeated STRING field"),
    b BOOL
  >
)
PARTITION BY DATE(_PARTITIONTIME)
OPTIONS(
  expiration_timestamp=TIMESTAMP "2020-01-01 00:00:00 UTC",
  partition_expiration_days=1,
  description="a table that expires in 2020, with each partition living for 24 hours",
  labels=[("org_unit", "development")]
)'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

从现有表创建新表

CREATE TABLE ... AS SELECT DDL 语句基于查询结果创建一个表。如果数据集内已存在该表名称,会返回以下错误:

Already Exists: project_id:dataset.table

以下示例在 mydataset 中创建了名为 top_words 的表。如果您未配置默认项目,请按以下格式将其添加到数据集名称之前:`project_id.dataset.table`(包括反引号);例如 `myproject.mydataset.rainy_days`

表架构中包含两列:

  • corpus - 莎士比亚全集的名称
  • top_words - STRUCT 类型的 ARRAY,包含两个字段:wordSTRING 类型)和 word_count(表示该 word 出现次数的 INT64

表选项列表指定了以下内容:

  • 说明 - 莎士比亚全集中出现次数最多的十个词

如需使用 DDL 创建新表,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     CREATE TABLE mydataset.top_words
     OPTIONS(
       description="Top ten words per Shakespeare corpus"
     ) AS
     SELECT
       corpus,
       ARRAY_AGG(STRUCT(word, word_count) ORDER BY word_count DESC LIMIT 10) AS top_words
     FROM bigquery-public-data.samples.shakespeare
     GROUP BY corpus;

  4. 点击运行。查询完成后,该表将显示在资源窗格中。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     CREATE TABLE mydataset.top_words
     OPTIONS(
       description="Top ten words per Shakespeare corpus"
     ) AS
     SELECT
       corpus,
       ARRAY_AGG(STRUCT(word, word_count) ORDER BY word_count DESC LIMIT 10) AS top_words
     FROM bigquery-public-data.samples.shakespeare
     GROUP BY corpus;

  4. 点击 Run query。查询完成后,该表将显示在导航窗格中。

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
     CREATE TABLE mydataset.top_words
     OPTIONS(
       description="Top ten words per Shakespeare corpus"
     ) AS
     SELECT
       corpus,
       ARRAY_AGG(STRUCT(word, word_count)
                 ORDER BY word_count DESC LIMIT 10) AS top_words
     FROM `bigquery-public-data.samples.shakespeare`
     GROUP BY corpus;'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

仅当表不存在时才创建表

仅当数据集中不存在表名称时,CREATE TABLE IF NOT EXISTS DDL 语句才使用指定选项创建表。如果数据集中存在表名称,则不会返回任何错误,也不会执行任何操作。

仅当 mydataset 中不存在名为 newtable 的表时,下述示例才会在 mydataset 中创建名为 newtable 的表。如果您未配置默认项目,请按以下格式将其添加到数据集名称之前:`project_id.dataset.table`(包括反引号);例如 `myproject.mydataset.newtable`

表架构中包含两列:

  • x - 整数
  • y - 包含 a(字符串数组)和 b(布尔值)的 STRUCT

表选项列表指定了以下内容:

  • 到期时间 - 世界协调时间 (UTC) 2020 年 1 月 1 日 00:00:00
  • 说明 - 于 2020 年到期的表
  • 标签 - org_unit = development

如需只在数据集中不存在表名称时才使用 DDL 创建新表,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     CREATE TABLE IF NOT EXISTS mydataset.newtable (x INT64, y STRUCT<a ARRAY<STRING>, b BOOL>)
     OPTIONS(
       expiration_timestamp=TIMESTAMP "2020-01-01 00:00:00 UTC",
       description="a table that expires in 2020",
       labels=[("org_unit", "development")]
     )
     

  4. 点击运行。查询完成后,该表将显示在资源窗格中。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     CREATE TABLE IF NOT EXISTS mydataset.newtable (x INT64, y STRUCT<a ARRAY<STRING>, b BOOL>)
     OPTIONS(
       expiration_timestamp=TIMESTAMP "2020-01-01 00:00:00 UTC",
       description="a table that expires in 2020",
       labels=[("org_unit", "development")]
     )
     

  4. 点击 Run query。查询完成后,该表将显示在导航窗格中。

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
CREATE TABLE IF NOT EXISTS mydataset.newtable (x INT64, y STRUCT<a ARRAY<STRING>, b BOOL>)
 OPTIONS(
   expiration_timestamp=TIMESTAMP "2020-01-01 00:00:00 UTC",
   description="a table that expires in 2020",
   labels=[("org_unit", "development")]
 )'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

创建或替换表

CREATE OR REPLACE TABLE DDL 语句会用指定选项创建表。如果数据集中存在表名称,会用空表覆盖该表。

以下示例会在 mydataset 中创建名为 newtable 的表,如果 mydataset 中存在 newtable,则会覆盖该表。如果您未配置默认项目,请按以下格式将其添加到数据集名称之前:`project_id.dataset.table`(包括反引号);例如 `myproject.mydataset.newtable`

表架构中包含两列:

  • x - 整数
  • y - 包含 a(字符串数组)和 b(布尔值)的 STRUCT

表选项列表指定了以下内容:

  • 到期时间 - 世界协调时间 (UTC) 2020 年 1 月 1 日 00:00:00
  • 说明 - 于 2020 年到期的表
  • 标签 - org_unit = development

如需使用 DDL 创建新表并覆盖具有相同名称的表,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     CREATE OR REPLACE TABLE mydataset.newtable (x INT64, y STRUCT<a ARRAY<STRING>, b BOOL>)
     OPTIONS(
       expiration_timestamp=TIMESTAMP "2020-01-01 00:00:00 UTC",
       description="a table that expires in 2020",
       labels=[("org_unit", "development")]
     )
     

  4. 点击运行

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     CREATE OR REPLACE TABLE mydataset.newtable (x INT64, y STRUCT<a ARRAY<STRING>, b BOOL>)
     OPTIONS(
       expiration_timestamp=TIMESTAMP "2020-01-01 00:00:00 UTC",
       description="a table that expires in 2020",
       labels=[("org_unit", "development")]
     )
     

  4. 点击 Run Query

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
CREATE OR REPLACE TABLE mydataset.newtable (x INT64, y STRUCT<a ARRAY<STRING>, b BOOL>)
 OPTIONS(
   expiration_timestamp=TIMESTAMP "2020-01-01 00:00:00 UTC",
   description="a table that expires in 2020",
   labels=[("org_unit", "development")]
 )'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

使用 REQUIRED 列创建表

NOT NULL 语句的列定义列表中的 CREATE TABLE 修饰符指定以 REQUIRED 模式创建列或字段。

以下示例在 mydataset 中创建名为 newtable 的表。如果数据集内存在表名称,会返回以下错误:

Already Exists: project_id:dataset.table

如果您未配置默认项目,请按以下格式将其添加到数据集名称之前:`project_id.dataset.table`(包括反引号);例如 `myproject.mydataset.newtable`

表架构中包含三列:

  • x - REQUIRED 整数
  • y - REQUIRED STRUCT,包含 a(字符串数组)、b(REQUIRED 布尔值)和 c(NULLABLE 浮点)
  • z - NULLABLE 字符串

如需使用 DDL 创建包含 REQUIRED 列的新表,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     CREATE TABLE my_dataset.new_table (
       x INT64 NOT NULL,
       y STRUCT<
         a ARRAY<STRING>,
         b BOOL NOT NULL,
         c FLOAT64
       > NOT NULL,
       z STRING
     )
     

  4. 点击运行。查询完成后,该表将显示在资源窗格中。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     CREATE TABLE my_dataset.new_table (
       x INT64 NOT NULL,
       y STRUCT<
         a ARRAY<STRING>,
         b BOOL NOT NULL,
         c FLOAT64
       > NOT NULL,
       z STRING
     )
     

  4. 点击 Run query。查询完成后,该表将显示在导航窗格中。

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
 CREATE TABLE my_dataset.new_table (
   x INT64 NOT NULL,
   y STRUCT<
     a ARRAY<STRING>,
     b BOOL NOT NULL,
     c FLOAT64
   > NOT NULL,
   z STRING
 )'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

创建分区表

以下示例使用一个 DATE 列在 mydataset 中创建名为 newtable分区表。如果您未配置默认项目,请按以下格式将其添加到数据集名称之前:`project_id.dataset.table`(包括反引号);例如 `myproject.mydataset.newtable`

表架构中包含两列:

  • transaction_id - 整数
  • transaction_date — 日期

表选项列表指定了以下内容:

  • 分区有效期限 - 三天
  • 说明 - 按 transaction_date 分区的表

如需使用 DDL 创建新表,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     CREATE TABLE mydataset.newtable (transaction_id INT64, transaction_date DATE)
     PARTITION BY transaction_date
     OPTIONS(
       partition_expiration_days=3,
       description="a table partitioned by transaction_date"
     )
     

  4. 点击运行。查询完成后,该表将显示在资源窗格中。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     CREATE TABLE mydataset.newtable (transaction_id INT64, transaction_date DATE)
     PARTITION BY transaction_date
     OPTIONS(
       partition_expiration_days=3,
       description="a table partitioned by transaction_date"
     )
     

  4. 点击 Run query。查询完成后,该表将显示在导航窗格中。

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
CREATE TABLE mydataset.newtable (transaction_id INT64, transaction_date DATE)
PARTITION BY transaction_date
OPTIONS(
  partition_expiration_days=3,
  description="a table partitioned by transaction_date"
)'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

从查询结果创建分区表

以下示例使用一个 DATE 列在 mydataset 中创建名为 days_with_rain分区表。如果您未配置默认项目,请按以下格式将其添加到数据集名称之前:`project_id.dataset.table`(包括反引号);例如 `myproject.mydataset.newtable`

表架构中包含两列:

  • date - 数据收集的 DATE
  • station_name - STRING 格式的气象站名称
  • prcp - FLOAT64 格式的降雨量(以英寸为单位)

表选项列表指定了以下内容:

  • 分区有效期限 - 一年
  • 说明 - 有降雨量的气象站,按天分区

如需使用 DDL 创建新表,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     CREATE TABLE mydataset.days_with_rain
     PARTITION BY date
     OPTIONS (
       partition_expiration_days=365,
       description="weather stations with precipitation, partitioned by day"
     ) AS
     SELECT
       DATE(CAST(year AS INT64), CAST(mo AS INT64), CAST(da AS INT64)) AS date,
       (SELECT ANY_VALUE(name) FROM `bigquery-public-data.noaa_gsod.stations` AS stations
        WHERE stations.usaf = stn) AS station_name,  -- Stations may have multiple names
       prcp
     FROM `bigquery-public-data.noaa_gsod.gsod2017` AS weather
     WHERE prcp != 99.9  -- Filter unknown values
       AND prcp > 0      -- Filter stations/days with no precipitation
     

  4. 点击运行。查询完成后,该表将显示在资源窗格中。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     CREATE TABLE mydataset.days_with_rain
     PARTITION BY date
     OPTIONS (
       partition_expiration_days=365,
       description="weather stations with precipitation, partitioned by day"
     ) AS
     SELECT
       DATE(CAST(year AS INT64), CAST(mo AS INT64), CAST(da AS INT64)) AS date,
       (SELECT ANY_VALUE(name) FROM `bigquery-public-data.noaa_gsod.stations` AS stations
        WHERE stations.usaf = stn) AS station_name,  -- Stations may have multiple names
       prcp
     FROM `bigquery-public-data.noaa_gsod.gsod2017` AS weather
     WHERE prcp != 99.9  -- Filter unknown values
       AND prcp > 0      -- Filter stations/days with no precipitation
     

  4. 点击 Run query。查询完成后,该表将显示在导航窗格中。

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
CREATE TABLE mydataset.days_with_rain
PARTITION BY date
OPTIONS (
  partition_expiration_days=365,
  description="weather stations with precipitation, partitioned by day"
) AS
SELECT
  DATE(CAST(year AS INT64), CAST(mo AS INT64), CAST(da AS INT64)) AS date,
  (SELECT ANY_VALUE(name) FROM `bigquery-public-data.noaa_gsod.stations` AS stations
   WHERE stations.usaf = stn) AS station_name,  -- Stations may have multiple names
  prcp
FROM `bigquery-public-data.noaa_gsod.gsod2017` AS weather
WHERE prcp != 99.9  -- Filter unknown values
  AND prcp > 0      -- Filter stations/days with no precipitation
'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

创建聚簇表

示例 1

以下示例在 mydataset 中创建名为 myclusteredtable聚簇表。该表是分区表,按 TIMESTAMP 列分区,并按名为 customer_idSTRING 列进行聚簇。

如果您未配置默认项目,请按以下格式将其添加到数据集名称之前:`project_id.dataset.table`(包括反引号);例如 `myproject.mydataset.myclusteredtable`

表架构中包含三列:

  • timestamp - TIMESTAMP 格式的数据收集时间
  • customer_id - STRING 格式的客户 ID
  • transaction_amount - NUMERIC 格式的交易金额

表选项列表指定了以下内容:

  • 分区有效期限 - 三天
  • 说明 -“a table clustered by customer_id”

如需使用 DDL 语句创建聚簇表,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     CREATE TABLE mydataset.myclusteredtable
     (
       timestamp TIMESTAMP,
       customer_id STRING,
       transaction_amount NUMERIC
     )
     PARTITION BY DATE(timestamp)
     CLUSTER BY customer_id
     OPTIONS (
       partition_expiration_days=3,
       description="a table clustered by customer_id"
     )

  4. 点击运行。查询完成后,该表将显示在资源窗格中。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 CREATE TABLE DDL 语句

     #standardSQL
     CREATE TABLE mydataset.myclusteredtable
     (
       timestamp TIMESTAMP,
       customer_id STRING,
       transaction_amount NUMERIC
     )
     PARTITION BY DATE(timestamp)
     CLUSTER BY customer_id
     OPTIONS (
       partition_expiration_days=3,
       description="a table clustered by customer_id"
     )

  4. 点击 Run query。查询完成后,该表将显示在导航窗格中。

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
CREATE TABLE mydataset.myclusteredtable
(
  timestamp TIMESTAMP,
  customer_id STRING,
  transaction_amount NUMERIC
)
PARTITION BY DATE(timestamp)
CLUSTER BY customer_id
OPTIONS (
  partition_expiration_days=3,
  description="a table clustered by customer_id"
)'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

示例 2

以下示例在 mydataset 中创建名为 myclusteredtable聚簇表。该表为提取时间分区表

如果您未配置默认项目,请按以下格式将其添加到数据集名称之前:`project_id.dataset.table`(包括反引号);例如 `myproject.mydataset.myclusteredtable`

表架构中包含三列:

  • timestamp - TIMESTAMP 格式的数据收集时间
  • customer_id - STRING 格式的客户 ID
  • transaction_amount - NUMERIC 格式的交易金额

表选项列表指定了以下内容:

  • 分区有效期限 - 三天
  • 说明 -“a table clustered by customer_id”

如需使用 DDL 语句创建聚簇表,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     CREATE TABLE mydataset.myclusteredtable
     (
       timestamp TIMESTAMP,
       customer_id STRING,
       transaction_amount NUMERIC
     )
     PARTITION BY DATE(_PARTITIONTIME)
     CLUSTER BY
       customer_id
     OPTIONS (
       partition_expiration_days=3,
       description="a table clustered by customer_id"
     )

  4. 点击运行。查询完成后,该表将显示在资源窗格中。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 CREATE TABLE DDL 语句。

     CREATE TABLE mydataset.myclusteredtable
     (
       timestamp TIMESTAMP,
       customer_id STRING,
       transaction_amount NUMERIC
     )
     PARTITION BY DATE(_PARTITIONTIME)
     CLUSTER BY
       customer_id
     OPTIONS (
       partition_expiration_days=3,
       description="a table clustered by customer_id"
     )

  4. 点击 Run query。查询完成后,该表将显示在导航窗格中。

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
CREATE TABLE mydataset.myclusteredtable
(
  timestamp TIMESTAMP,
  customer_id STRING,
  transaction_amount NUMERIC
)
PARTITION BY DATE(_PARTITIONTIME)
CLUSTER BY
  customer_id
OPTIONS (
  partition_expiration_days=3,
  description="a table clustered by customer_id"
)'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

从查询结果创建聚簇表

以下示例使用查询结果在 mydataset 中创建名为 myclusteredtable聚簇表。该表是按 TIMESTAMP 列分区的分区表

如果您未配置默认项目,请按以下格式将其添加到数据集名称之前:`project_id.dataset.table`(包括反引号);例如 `myproject.mydataset.myclusteredtable`

表架构中包含三列:

  • timestamp - TIMESTAMP 格式的数据收集时间
  • customer_id - STRING 格式的客户 ID
  • transaction_amount - NUMERIC 格式的交易金额

表选项列表指定了以下内容:

  • 分区有效期限 - 三天
  • 说明 -“a table clustered by customer_id”

如需使用 DDL 语句创建聚簇表,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     CREATE TABLE mydataset.myclusteredtable
     (
       timestamp TIMESTAMP,
       customer_id STRING,
       transaction_amount NUMERIC
     )
     PARTITION BY DATE(timestamp)
     CLUSTER BY
       customer_id
     OPTIONS (
       partition_expiration_days=3,
       description="a table clustered by customer_id"
     )
     AS SELECT * FROM mydataset.myothertable

  4. 点击运行。查询完成后,该表将显示在资源窗格中。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 CREATE TABLE DDL 语句。

     #standardSQL
     CREATE TABLE mydataset.myclusteredtable
     (
       timestamp TIMESTAMP,
       customer_id STRING,
       transaction_amount NUMERIC
     )
     PARTITION BY DATE(timestamp)
     CLUSTER BY
       customer_id
     OPTIONS (
       partition_expiration_days=3,
       description="a table clustered by customer_id"
     )
     AS SELECT * FROM mydataset.myothertable

  4. 点击 Run query。查询完成后,该表将显示在导航窗格中。

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
CREATE TABLE mydataset.myclusteredtable
  (
    timestamp TIMESTAMP,
    customer_id STRING,
    transaction_amount NUMERIC
  )
PARTITION BY DATE(timestamp)
CLUSTER BY
  customer_id
OPTIONS (
  partition_expiration_days=3,
  description="a table clustered by customer_id"
)
AS SELECT * FROM mydataset.myothertable'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

CREATE VIEW 语句

如需在 BigQuery 中创建视图,请使用 CREATE VIEW DDL 语句。

语法

{CREATE VIEW | CREATE VIEW IF NOT EXISTS | CREATE OR REPLACE VIEW}
view_name
[OPTIONS(view_option_list)]
AS query_expression

其中:

{CREATE VIEW | CREATE VIEW IF NOT EXISTS | CREATE OR REPLACE VIEW} 是下述语句之一:

  • CREATE VIEW - 创建新视图。
  • CREATE VIEW IF NOT EXISTS - 仅当指定的数据集中不存在要创建的视图时才创建此视图。
  • CREATE OR REPLACE VIEW - 在指定数据集中创建视图并替换具有相同名称的现有视图。

view_name 是您要创建的视图的名称。每个数据集的视图名称必须是唯一的。视图名称要求:

  • 包含最多 1024 个字符
  • 包含字母(大写或小写)、数字和下划线

通过 view_option_list,您可以指定其他视图创建选项,例如标签和到期时间。

CREATE VIEW 语句必须符合以下规则:

  • 只能使用一个 CREATE 语句。

query_expression 是用于定义视图的标准 SQL 查询表达式。

view_option_list

通过选项列表,您可以设置视图选项,例如标签和到期时间。可使用逗号分隔列表包括多个选项。

请按以下格式指定视图选项列表:

NAME=VALUE, ...

NAMEVALUE 必须是下述组合之一:

NAME VALUE 详细信息
expiration_timestamp TIMESTAMP

示例:expiration_timestamp=TIMESTAMP "2020-01-01 00:00:00 UTC"

此属性等效于 expirationTime 表资源属性。

friendly_name

STRING

示例:friendly_name="my_view"

此属性等效于 friendlyName 表资源属性。

description

STRING

示例:description="a view that expires in 2020"

此属性等效于 description 表资源属性。

labels

ARRAY<STRUCT<STRING, STRING>>

示例:labels=[("org_unit", "development")]

此属性等效于 labels 表资源属性。

VALUE 是一个常量表达式,它只包含字面量、查询参数和标量函数。如果常量表达式的计算结果为 null,则忽略对应的 NAME 选项。

常量表达式不得包含以下内容:

  • 对表的引用
  • 子查询和 SQL 语句,如 SELECTCREATEUPDATE
  • 用户定义的函数、聚合函数或分析函数
  • 以下标量函数:
    • ARRAY_TO_STRING
    • REPLACE
    • REGEXP_REPLACE
    • RAND
    • FORMAT
    • LPAD
    • RPAD
    • REPEAT
    • SESSION_USER
    • GENERATE_ARRAY
    • GENERATE_DATE_ARRAY

示例

创建新视图

CREATE VIEW DDL 语句会用指定选项创建视图。如果数据集中存在视图名称,会返回以下错误:

Already Exists: project_id:dataset.table

以下示例在 mydataset 中创建名为 newview 的视图。使用 DDL 语句创建视图时,您必须按以下格式指定项目、数据集和视图:`project_id.dataset.table`(包括反引号);例如 `myproject.mydataset.newview`

视图使用以下标准 SQL 查询进行定义:

SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

视图选项列表指定了以下内容:

  • 到期时间 - 自创建视图后 48 小时
  • 易记名称 - newview
  • 说明 - 在两天后到期的视图
  • 标签 - org_unit = development

如需使用 DDL 创建新视图,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     CREATE VIEW `myproject.mydataset.newview`
     OPTIONS(
       expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
       friendly_name="newview",
       description="a view that expires in 2 days",
       labels=[("org_unit", "development")]
     )
     AS SELECT column_1, column_2, column_3 FROM myproject.mydataset.mytable
     

  4. 点击运行。查询完成后,该视图将显示在资源窗格中。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     CREATE VIEW `myproject.mydataset.newview`
     OPTIONS(
       expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
       friendly_name="newview",
       description="a view that expires in 2 days",
       labels=[("org_unit", "development")]
     )
     AS SELECT column_1, column_2, column_3 FROM myproject.mydataset.mytable
     

  4. 点击 Run query。查询完成后,该视图将显示在导航窗格中。

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
CREATE TABLE `myproject.mydataset.newview`
 OPTIONS(
   expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
   friendly_name="newview",
   description="a view that expires in 2 days",
   labels=[("org_unit", "development")]
 )
 AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

JAVA

调用 BigQuery.create() 方法启动查询作业。调用 Job.waitFor() 方法,等待 DDL 查询完成。

// import com.google.cloud.bigquery.*;
// String projectId = "my-project";
// String datasetId = "my_dataset";
// String tableId = "new_view";
// BigQuery bigquery = BigQueryOptions.getDefaultInstance().toBuilder()
//     .setProjectId(projectId)
//     .build().getService();

String sql =
    String.format(
        "CREATE VIEW `%s.%s.%s`\n"
            + "OPTIONS(\n"
            + "  expiration_timestamp=TIMESTAMP_ADD(\n"
            + "    CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),\n"
            + "  friendly_name=\"new_view\",\n"
            + "  description=\"a view that expires in 2 days\",\n"
            + "  labels=[(\"org_unit\", \"development\")]\n"
            + ")\n"
            + "AS SELECT name, state, year, number\n"
            + "  FROM `bigquery-public-data.usa_names.usa_1910_current`\n"
            + "  WHERE state LIKE 'W%%';\n",
        projectId, datasetId, tableId);

// Make an API request to run the query job.
Job job = bigquery.create(JobInfo.of(QueryJobConfiguration.newBuilder(sql).build()));

// Wait for the query to finish.
job = job.waitFor();

QueryJobConfiguration jobConfig = (QueryJobConfiguration) job.getConfiguration();
System.out.printf(
    "Created new view \"%s.%s.%s\".\n",
    jobConfig.getDestinationTable().getProject(),
    jobConfig.getDestinationTable().getDataset(),
    jobConfig.getDestinationTable().getTable());

PYTHON

调用 Client.query() 方法,启动查询作业。调用 QueryJob.result() 方法,等待 DDL 查询完成。

# from google.cloud import bigquery
# project = 'my-project'
# dataset_id = 'my_dataset'
# table_id = 'new_view'
# client = bigquery.Client(project=project)

sql = """
CREATE VIEW `{}.{}.{}`
OPTIONS(
    expiration_timestamp=TIMESTAMP_ADD(
        CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
    friendly_name="new_view",
    description="a view that expires in 2 days",
    labels=[("org_unit", "development")]
)
AS SELECT name, state, year, number
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state LIKE 'W%'
""".format(
    project, dataset_id, table_id
)

job = client.query(sql)  # API request.
job.result()  # Waits for the query to finish.

print(
    'Created new view "{}.{}.{}".'.format(
        job.destination.project,
        job.destination.dataset_id,
        job.destination.table_id,
    )
)

仅当视图不存在时才创建此视图

仅当数据集中不存在视图名称时,CREATE VIEW IF NOT EXISTS DDL 语句才使用指定选项创建视图。如果数据集中存在视图名称,则不会返回任何错误,也不会执行任何操作。

以下示例只有在 mydataset 中不存在名为 newview 的视图时才会在 mydataset 中创建名为 newview 的视图。使用 DDL 语句创建视图时,您必须按以下格式指定项目、数据集和视图:`project_id.dataset.table`(包括反引号);例如 `myproject.mydataset.newview`

视图使用以下标准 SQL 查询进行定义:

SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

视图选项列表指定了以下内容:

  • 到期时间 - 自创建视图后 48 小时
  • 易记名称 - newview
  • 说明 - 在两天后到期的视图
  • 标签 - org_unit = development

如需只在数据集中不存在视图名称时才使用 DDL 创建新视图,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     CREATE VIEW IF NOT EXISTS `myproject.mydataset.newview`
     OPTIONS(
       expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
       friendly_name="newview",
       description="a view that expires in 2 days",
       labels=[("org_unit", "development")]
     )
     AS SELECT column_1, column_2, column_3 FROM myproject.mydataset.mytable
     

  4. 点击运行。查询完成后,该视图将显示在资源窗格中。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     CREATE VIEW IF NOT EXISTS `myproject.mydataset.newview`
     OPTIONS(
       expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
       friendly_name="newview",
       description="a view that expires in 2 days",
       labels=[("org_unit", "development")]
     )
     AS SELECT column_1, column_2, column_3 FROM myproject.mydataset.mytable
     

  4. 点击 Run query。查询完成后,该视图将显示在导航窗格中。

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
CREATE VIEW IF NOT EXISTS `myproject.mydataset.newview`
 OPTIONS(
   expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
   friendly_name="newview",
   description="a view that expires in 2 days",
   labels=[("org_unit", "development")]
 )
 AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

创建或替换视图

CREATE OR REPLACE VIEW DDL 语句会用指定选项创建视图。如果数据集中存在视图名称,会使用指定的查询表达式覆盖该视图。

以下示例会在 mydataset 中创建名为 newview 的视图,如果 mydataset 中存在 newview,则会覆盖该视图。使用 DDL 语句创建视图时,您必须按以下格式指定项目、数据集和视图:`project_id.dataset.table`(包括反引号);例如 `myproject.mydataset.newview`

视图使用以下标准 SQL 查询进行定义:

    SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

视图选项列表指定了以下内容:

  • 到期时间 - 自创建视图后 48 小时
  • 易记名称 - 新视图
  • 说明 - 在两天后到期的视图
  • 标签 - org_unit = development

如需使用 DDL 创建新视图并覆盖含相同名称的视图,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     CREATE OR REPLACE VIEW `myproject.mydataset.newview`
     OPTIONS(
       expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
       friendly_name="newview",
       description="a view that expires in 2 days",
       labels=[("org_unit", "development")]
     )
     AS SELECT column_1, column_2, column_3 FROM myproject.mydataset.mytable
     

  4. 点击运行。查询完成后,该视图将显示在资源窗格中。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     CREATE OR REPLACE VIEW `myproject.mydataset.newview`
     OPTIONS(
       expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
       friendly_name="newview",
       description="a view that expires in 2 days",
       labels=[("org_unit", "development")]
     )
     AS SELECT column_1, column_2, column_3 FROM myproject.mydataset.mytable
     

  4. 点击 Run query。查询完成后,该视图将显示在导航窗格中。

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
CREATE OR REPLACE VIEW `myproject.mydataset.newview`
 OPTIONS(
   expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
   friendly_name="newview",
   description="a view that expires in 2 days",
   labels=[("org_unit", "development")]
 )
 AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

CREATE FUNCTION 语句

BigQuery 支持用户定义函数 (UDF)。借助 UDF,您可以使用 SQL 表达式或 JavaScript 创建函数。这些函数接受输入列并执行操作,然后以值的形式返回这些操作的结果。

UDF 可以是永久性的,也可以是临时性的。您可以在多个查询间重复使用永久性 UDF,但只能在单个查询中使用临时性 UDF。如需了解临时性 UDF,请参阅用户定义函数文档

UDF 语法

BigQuery 中的永久性用户定义函数使用以下语法:

CREATE { FUNCTION | OR REPLACE FUNCTION | FUNCTION IF NOT EXISTS }
    dataset_name.function_name ([named_parameter[, ...]])
  [RETURNS data_type]
  { sql_function_definition | javascript_function_definition }

named_parameter:
  param_name param_type

sql_function_definition:
  AS (sql_expression)

javascript_function_definition:
  LANGUAGE js
  [OPTIONS (library = library_array)]
  AS javascript_code

此语法由以下部分组成:

  • CREATE { FUNCTION | OR REPLACE FUNCTION | FUNCTION IF NOT EXISTS }。 创建新函数。函数可包含零个或多个 named_parameter。如需替换名称相同的任何现有函数,请使用 OR REPLACE 关键字。如需在存在名称相同的函数的情况下将查询视为成功,而不执行任何操作,请使用 IF NOT EXISTS 子句。
  • named_parameter。由英文逗号分隔的 param_nameparam_type 对组成。param_type 的值为 BigQuery 数据类型。对于 SQL UDF,param_type 的值也可以是 ANY TYPE
  • [RETURNS data_type]。它指定函数返回的数据类型。
    • 如果函数是使用 SQL 定义的,则 RETURNS 子句是可选的。如果省略 RETURNS 子句,则当查询调用函数时,BigQuery 会通过 SQL 函数体推断出函数的结果类型;函数不会保留推断的返回类型。如果函数定义引用了另一个函数,则推断出的返回类型可能取决于被引用函数的返回类型,并且将在被引用函数更新时自动更新。
    • 如果函数是使用 JavaScript 定义的,则需要 RETURNS 子句。如需详细了解可使用的 data_type 值,请参阅支持的 JavaScript UDF 数据类型
  • AS (sql_expression)。它指定用于定义函数的 SQL 表达式。
  • [OPTIONS (library = library_array)]。对于 JavaScript UDF,请指定要包含在函数定义中的 JavaScript 库数组。
  • AS javascript_code。它指定 JavaScript 函数的定义。 javascript_code 是一个字符串字面量。

SQL UDF 结构

使用以下语法创建 SQL UDF:

CREATE { FUNCTION | OR REPLACE FUNCTION | FUNCTION IF NOT EXISTS }
  dataset_name.function_name ([named_parameter[, ...]])
  [RETURNS data_type]
  AS (sql_expression)

named_parameter:
  param_name param_type

模板化 SQL UDF 参数

在调用函数时,模板化参数可以匹配多个参数类型。如果函数签名包含模板化参数,则 BigQuery 允许函数调用将多个参数类型之一传递给函数。

SQL 用户定义函数签名可以包含以下模板化 param_type 值:

  • ANY TYPE。该函数将接受此参数的任何类型的输入。如果多个参数具有 ANY TYPE 类型,则 BigQuery 不会在创建函数时强制执行这些参数之间的任何关系。但是,向函数传递与函数定义不兼容类型的参数将导致调用时出错。

SQL UDF 示例

以下示例会创建一个永久性 SQL UDF。它假设活动项目中存在名为 mydataset 的数据集。如果不存在使用此名称的数据集,请参阅关于如何创建数据集的文档

CREATE FUNCTION mydataset.multiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
AS (x * y);

执行 CREATE FUNCTION 语句后,您可以在单独的查询中使用新的永久性用户定义函数。将查询编辑器中的内容替换为以下内容,然后运行查询:

WITH numbers AS
  (SELECT 1 AS x, 5 as y
  UNION ALL
  SELECT 2 AS x, 10 as y
  UNION ALL
  SELECT 3 as x, 15 as y)
SELECT x, y, mydataset.multiplyInputs(x, y) as product
FROM numbers;

上面的示例生成以下输出:

+-----+-----+--------------+
| x   | y   | product      |
+-----+-----+--------------+
| 1   | 5   | 5            |
| 2   | 10  | 20           |
| 3   | 15  | 45           |
+-----+-----+--------------+

以下示例展示了使用模板化参数的永久性 SQL UDF。生成的函数可接受各种类型的参数。

CREATE FUNCTION mydataset.addFourAndDivideAny(x ANY TYPE, y ANY TYPE) AS (
  (x + 4) / y
);

执行 CREATE FUNCTION 语句后,您可以在单独的查询中使用新的永久性用户定义函数:

SELECT addFourAndDivideAny(3, 4) AS integer_output,
       addFourAndDivideAny(1.59, 3.14) AS floating_point_output;

此查询返回以下输出:

+----------------+-----------------------+
| integer_output | floating_point_output |
+----------------+-----------------------+
| 1.75           | 1.7802547770700636    |
+----------------+-----------------------+

以下示例所示的 SQL UDF 使用模板化参数返回任何类型的数组的最后一个元素。

CREATE FUNCTION mydataset.lastArrayElement(arr ANY TYPE) AS (
  arr[ORDINAL(ARRAY_LENGTH(arr))]
);

执行 CREATE FUNCTION 语句后,您可以在单独的查询中使用新的永久性用户定义函数:

SELECT
  names[OFFSET(0)] AS first_name,
  lastArrayElement(names) AS last_name
FROM (
  SELECT ['Fred', 'McFeely', 'Rogers'] AS names UNION ALL
  SELECT ['Marie', 'Skłodowska', 'Curie']
);

以上查询返回以下输出:

+------------+-----------+
| first_name | last_name |
+------------+-----------+
| Fred       | Rogers    |
| Marie      | Curie     |
+------------+-----------+

JavaScript UDF 结构

使用以下语法创建永久性 JavaScript UDF。

CREATE { FUNCTION | OR REPLACE FUNCTION | FUNCTION IF NOT EXISTS }
  dataset_name.function_name ([named_parameter[, ...]])
  [RETURNS data_type]
  LANGUAGE js
  [OPTIONS (library = library_array)]
  AS javascript_code

JavaScript UDF 示例

CREATE TEMP FUNCTION mydataset.multiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS """
  return x*y;
""";

执行 CREATE FUNCTION 语句后,您可以在单独的查询中使用新的永久性 JavaScript UDF:

WITH numbers AS
  (SELECT 1 AS x, 5 as y
  UNION ALL
  SELECT 2 AS x, 10 as y
  UNION ALL
  SELECT 3 as x, 15 as y)
SELECT x, y, multiplyInputs(x, y) as product
FROM numbers;

上面的示例返回以下输出:

+-----+-----+--------------+
| x   | y   | product      |
+-----+-----+--------------+
| 1   | 5   | 5            |
| 2   | 10  | 20           |
| 3   | 15  | 45           |
+-----+-----+--------------+

您可以将 UDF 的结果作为输入传递给另一个 UDF。例如,使用以下查询创建永久性 UDF:

CREATE FUNCTION mydataset.multiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS """
  return x*y;
""";

然后运行另一个查询来创建第二个永久性 UDF:

CREATE FUNCTION mydataset.divideByTwo(x FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS """
  return x/2;
""";

现在,运行以下查询以在同一查询中使用这两个永久性 UDF:

WITH numbers AS
  (SELECT 1 AS x, 5 as y
  UNION ALL
  SELECT 2 AS x, 10 as y
  UNION ALL
  SELECT 3 as x, 15 as y)
SELECT x,
  y,
  mydataset.multiplyInputs(
    mydataset.divideByTwo(x), mydataset.divideByTwo(y)) as half_product
FROM numbers;

上面的示例返回以下输出:

+-----+-----+--------------+
| x   | y   | half_product |
+-----+-----+--------------+
| 1   | 5   | 1.25         |
| 2   | 10  | 5            |
| 3   | 15  | 11.25        |
+-----+-----+--------------+

以下示例对给定 JSON 字符串中名为“foo”的所有字段的值进行求和。

CREATE FUNCTION mydataset.SumFieldsNamedFoo(json_row STRING)
  RETURNS FLOAT64
  LANGUAGE js
  AS """
  function SumFoo(obj) {
    var sum = 0;
    for (var field in obj) {
      if (obj.hasOwnProperty(field) &amp;&amp; obj[field] != null) {
        if (typeof obj[field] == "object") {
          sum += SumFoo(obj[field]);
        } else if (field == "foo") {
          sum += obj[field];
        }
      }
    }
    return sum;
  }
  var row = JSON.parse(json_row);
  return SumFoo(row);
  """;

执行 CREATE FUNCTION 语句后,您可以在单独的查询中使用新的永久性用户定义函数:

WITH Input AS (
  SELECT STRUCT(1 AS foo, 2 AS bar, STRUCT('foo' AS x, 3.14 AS foo) AS baz) AS s, 10 AS foo UNION ALL
  SELECT NULL, 4 AS foo UNION ALL
  SELECT STRUCT(NULL, 2 AS bar, STRUCT('fizz' AS x, 1.59 AS foo) AS baz) AS s, NULL AS foo
)
SELECT
  TO_JSON_STRING(t) AS json_row,
  mydataset.SumFieldsNamedFoo(TO_JSON_STRING(t)) AS foo_sum
FROM Input AS t;

上面的示例返回以下输出:

+---------------------------------------------------------------------+---------+
| json_row                                                            | foo_sum |
+---------------------------------------------------------------------+---------+
| {"s":{"foo":1,"bar":2,"baz":{"x":"foo","foo":3.14}},"foo":10}       | 14.14   |
| {"s":null,"foo":4}                                                  | 4       |
| {"s":{"foo":null,"bar":2,"baz":{"x":"fizz","foo":1.59}},"foo":null} | 1.59    |
+---------------------------------------------------------------------+---------+

支持的 JavaScript UDF 数据类型

对于 JavaScript UDF,BigQuery 支持以下数据类型:

  • ARRAY
  • BOOL
  • BYTES
  • DATE
  • FLOAT64
  • NUMERIC
  • STRING
  • STRUCT
  • TIMESTAMP

JavaScript 中的 SQL 类型编码

有些 SQL 类型可直接映射到 JavaScript 类型,但有些则不行。

由于 JavaScript 不支持 64 位整数类型,因此系统不支持将 INT64 用作 JavaScript UDF 的输入类型。请改为使用 FLOAT64 以数字表示整数值,或使用 STRING 以字符串表示整数值。

BigQuery 不支持将 INT64 用作 JavaScript UDF 中的返回类型。在这种情况下,JavaScript 函数体可以返回 JavaScript Number 或 String。随后,BigQuery 将其中任一类型转换为 INT64

BigQuery 采用下列方式表示类型:

BigQuery 数据类型 JavaScript 数据类型
ARRAY ARRAY
BOOL BOOLEAN
BYTES base64 编码的 STRING
FLOAT64 NUMBER
NUMERIC 如果 NUMERIC 值可精确表示为 IEEE 754 浮点值且不带小数,则将其编码为数字。这些值在 [-253, 253] 范围内。否则,将其编码为字符串。
STRING STRING
STRUCT OBJECT,其中每个 STRUCT 字段都是命名字段
TIMESTAMP 带微秒字段的 DATE,该字段包含时间戳的 microsecond 部分
DATE DATE

引用规则

必须将 JavaScript 代码用引号括起来。对于一行简单的代码段,可使用带标准英文引号的字符串:

CREATE FUNCTION mydataset.plusOne(x FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS "return x+1;";

如果代码段包含英文引号或由多行组成,请使用三引号块:

CREATE FUNCTION mydataset.customGreeting(a STRING)
RETURNS STRING
LANGUAGE js AS """
  var d = new Date();
  if (d.getHours() &lt; 12) {
    return 'Good Morning, ' + a + '!';
  } else {
    return 'Good Evening, ' + a + '!';
  }
  """;

包括 JavaScript 库

可使用 OPTIONS 部分扩展 JavaScript UDF。在本部分中,您可以为 UDF 指定 JavaScript 代码库。

CREATE FUNCTION mydataset.myFunc(a FLOAT64, b STRING)
  RETURNS STRING
  LANGUAGE js
  OPTIONS (
    library=["gs://my-bucket/path/to/lib1.js", "gs://my-bucket/path/to/lib2.js"]
  )
  AS
  """
      // Assumes 'doInterestingStuff' is defined in one of the library files.
      return doInterestingStuff(a, b);
  """;

SELECT mydataset.myFunc(3.14, 'foo');

在上述示例中,lib1.jslib2.js 中的代码可用于 UDF 的 javascript_code 部分中的任何代码。请注意,您可以使用单元素或数组语法来指定库文件。

UDF 和网页界面

您可以使用 BigQuery 网页界面创建永久性用户定义函数。

通过运行查询来创建永久性 UDF

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 UDF 语句。例如:

      CREATE FUNCTION mydataset.timesTwo(x FLOAT64)
      RETURNS FLOAT64
        LANGUAGE js AS """
        return x*2;
      """;
    
  4. 点击运行

  5. 创建永久性用户定义函数后,将编辑器中的内容替换为使用该函数的新查询:

      SELECT mydataset.timesTwo(numbers) as doubles
      FROM UNNEST([1, 2, 3, 4, 5]) AS numbers;
    
  6. 点击运行

UDF 和 bq 命令行工具

您可以使用 Cloud SDK 中的 bq 命令行工具来创建永久性 UDF。

使用以下语法运行查询,以创建永久性 UDF:

bq query --use_legacy_sql=false '
  CREATE FUNCTION mydataset.AddTwo(x INT64) AS (x + 2);
'

JavaScript UDF 的最佳做法

预过滤输入

如果在将输入传递到 JavaScript UDF 之前可以方便地进行过滤以减少其数量,您的查询速度将更快,费用会更低。

避免持久的可变状态

不要在 JavaScript UDF 调用之间存储或访问可变状态。

高效使用内存

在 JavaScript 处理环境中,每个查询可使用的内存有限。累积太多本地状态的 JavaScript UDF 查询可能因内存耗尽而失败。

限制

以下限制适用于临时性和永久性用户定义函数。

  • 不支持 DOM 对象 WindowDocumentNode 以及需要这些对象的函数。
  • 不支持依赖原生代码的 JavaScript 函数。
  • 由于调用 JavaScript 用户定义函数的查询存在不确定性,因此此类查询无法使用缓存结果。
  • 无法在 UDF 中引用表。
  • 处理单独的一行时,JavaScript UDF 输出的数据量 - 约 5 MB 或更小。
  • 包含用户定义函数 (UDF) 的旧版 SQL 查询的并发速率限制 - 6 个并发查询。
  • 包含 UDF 的旧版 SQL 查询的并发速率限制涵盖交互式查询和批量查询。包含 UDF 的交互式查询也会计入交互式查询的并发速率限制。此限制不适用于标准 SQL 查询。

  • 查询作业中的 JavaScript UDF 资源(例如内嵌代码 blob 或外部文件)的数量上限 - 50
  • 每个内嵌代码 blob 的大小上限 - 32 KB。
  • 每个外部代码资源的大小上限 - 1 MB。

以下限制适用于永久性用户定义函数
  • 函数名称的长度上限 - 256 个字符
  • 参数数量上限 - 256
  • 参数名称的长度上限 - 128 个字符
  • 用户定义函数引用链的深度上限 - 16
  • 类型为 STRUCT 的参数或输出的深度上限 - 15
  • 类型为 STRUCT 的参数或输出中的字段数上限(每个 UDF) - 1024
  • 每次查询的唯一 UDF 和表引用数上限 - 1000 充分扩展后,每个 UDF 可引用的唯一表和 UDF 总数最高为 1000 个。
  • CREATE FUNCTION 语句中的 JavaScript 库的数量上限 - 50
  • 包含的 JavaScript 库路径的长度上限 - 5000 个字符
  • 每个 UDF 的更新速率上限 - 5 次/10 秒 创建函数后,每个函数每 10 秒最多可更新 5 次。
  • 每个内嵌代码 blob 的大小上限为 32 KB。
  • 每项 JavaScript 代码资源的大小上限为 1 MB。
  • JavaScript 中的按位运算仅处理最高有效 32 位。
  • 每个数据集只能包含一个具有相同名称的永久性 UDF。但是,您可以创建与同一数据集内的某个表同名的 UDF。
  • 从其他永久性 UDF 引用永久性 UDF 时,必须使用数据集限定名称。 例如:
    CREATE FUNCTION mydataset.referringFunction() AS (mydataset.referencedFunction());
  • 从逻辑视图引用永久性 UDF 时,必须使用项目和数据集完全限定名称。 例如:
    CREATE VIEW mydataset.sample_view AS SELECT my-project.mydataset.referencedFunction();

以下限制适用于临时性用户定义函数。

  • 创建临时性 UDF 时,function_name 不能包含英文句点。
  • 逻辑视图不能引用临时性 UDF。

ALTER TABLE SET OPTIONS 语句

如需在 BigQuery 中设置表中的选项,请使用 ALTER TABLE SET OPTIONS DDL 语句。

语法

{ALTER TABLE | ALTER TABLE IF EXISTS}
table_name
SET OPTIONS(table_set_options_list)

其中:

{ALTER TABLE | ALTER TABLE IF EXISTS} 是下述语句之一:

  • ALTER TABLE - 更改现有表中的选项。
  • ALTER TABLE IF EXISTS - 仅当表存在时才更改此表中的选项。

table_name 是您要更改的表的名称。

table_set_options_list

可通过选项列表设置标签和到期时间等表选项。可使用逗号分隔列表包括多个选项。

请按以下格式指定表选项列表:

NAME=VALUE, ...

NAMEVALUE 必须是下述组合之一:

NAME VALUE 详细信息
expiration_timestamp TIMESTAMP

示例:expiration_timestamp=TIMESTAMP "2020-01-01 00:00:00 UTC"

此属性等效于 expirationTime 表资源属性。

partition_expiration_days

FLOAT64

示例:partition_expiration_days=7

此属性等效于 timePartitioning.expirationMs 表资源属性,但单位是天而非毫秒。一天相当于 8640 万毫秒(即 24 小时)。

只能对分区表设置此属性。

require_partition_filter

BOOL

示例:require_partition_filter=true

此属性等效于 timePartitioning.requirePartitionFilter 表资源属性。

只能对分区表设置此属性。

kms_key_name

STRING

示例:kms_key_name="projects/project_id/locations/location/keyRings/keyring/cryptoKeys/key"

此属性等效于 encryptionConfiguration.kmsKeyName 表资源属性。

请查看有关使用 Cloud KMS 密钥保护数据的详细信息。

friendly_name

STRING

示例:friendly_name="my_table"

此属性等效于 friendlyName 表资源属性。

description

STRING

示例:description="a table that expires in 2020"

此属性等效于 description 表资源属性。

labels

ARRAY<STRUCT<STRING, STRING>>

示例:labels=[("org_unit", "development")]

此属性等效于 labels 表资源属性。

VALUE 是一个常量表达式,它只包含字面量、查询参数和标量函数。如果常量表达式的计算结果为 null,则忽略对应的 NAME 选项。

常量表达式不得包含以下内容:

  • 对表的引用
  • 子查询和 SQL 语句,如 SELECTCREATEUPDATE
  • 用户定义的函数、聚合函数或分析函数
  • 以下标量函数:
    • ARRAY_TO_STRING
    • REPLACE
    • REGEXP_REPLACE
    • RAND
    • FORMAT
    • LPAD
    • RPAD
    • REPEAT
    • SESSION_USER
    • GENERATE_ARRAY
    • GENERATE_DATE_ARRAY

设置 VALUE 会替换表的该选项的现有值(如果有)。将 VALUE 设置为 NULL 会清除表中该选项的值。

示例

设置表上的到期时间戳和说明

以下示例将表的到期时间戳设置为执行 ALTER TABLE 语句后七天,同时设置了说明:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     ALTER TABLE mydataset.mytable
     SET OPTIONS (
       expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY),
       description="Table that expires seven days from now"
     )
     

  4. 点击运行

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     ALTER TABLE mydataset.mytable
     SET OPTIONS (
       expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY),
       description="Table that expires seven days from now"
     )
     

  4. 点击 Run Query

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
ALTER TABLE mydataset.mytable
SET OPTIONS (
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY),
  description="Table that expires seven days from now"
)'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

对分区表设置 require partition filter 特性

以下示例会对分区表设置 timePartitioning.requirePartitionFilter 特性。该特性设置为 true 时,引用此表的查询必须对分区列使用过滤条件,否则 BigQuery 会返回错误。通过将此选项设置为 true,可帮助避免在查询数据量超过预期时出现错误:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     ALTER TABLE mydataset.mypartitionedtable
     SET OPTIONS (require_partition_filter=true)
     

  4. 点击运行

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     ALTER TABLE mydataset.mypartitionedtable
     SET OPTIONS (require_partition_filter=true)
     

  4. 点击 Run Query

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
ALTER TABLE mydataset.mypartitionedtable
SET OPTIONS (require_partition_filter=true)'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

清除表上的到期时间戳

以下示例会清除表上的到期时间戳,使其不会过期:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     ALTER TABLE mydataset.mytable
     SET OPTIONS (expiration_timestamp=NULL)
     

  4. 点击运行

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     ALTER TABLE mydataset.mytable
     SET OPTIONS (expiration_timestamp=NULL)
     

  4. 点击 Run Query

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
ALTER TABLE mydataset.mytable
SET OPTIONS (expiration_timestamp=NULL)'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

ALTER VIEW SET OPTIONS 语句

如需在 BigQuery 中针对视图设置选项,请使用 ALTER VIEW SET OPTIONS DDL 语句。

语法

{ALTER VIEW | ALTER VIEW IF EXISTS}
view_name
SET OPTIONS(view_set_options_list)

其中:

{ALTER VIEW | ALTER VIEW IF EXISTS} 是下述语句之一:

  • ALTER VIEW - 更改现有视图上的选项。
  • ALTER VIEW IF EXISTS - 仅当视图存在时才更改此视图上的选项。

view_name 是您要更改的视图的名称。

view_set_options_list

通过选项列表,您可以设置视图选项,例如标签和到期时间。可使用逗号分隔列表包括多个选项。

请按以下格式指定视图选项列表:

NAME=VALUE, ...

NAMEVALUE 必须是下述组合之一:

NAME VALUE 详细信息
expiration_timestamp TIMESTAMP

示例:expiration_timestamp=TIMESTAMP "2020-01-01 00:00:00 UTC"

此属性等效于 expirationTime 表资源属性。

friendly_name

STRING

示例:friendly_name="my_view"

此属性等效于 friendlyName 表资源属性。

description

STRING

示例:description="a view that expires in 2020"

此属性等效于 description 表资源属性。

labels

ARRAY<STRUCT<STRING, STRING>>

示例:labels=[("org_unit", "development")]

此属性等效于 labels 表资源属性。

VALUE 是一个常量表达式,它只包含字面量、查询参数和标量函数。如果常量表达式的计算结果为 null,则忽略对应的 NAME 选项。

常量表达式不得包含以下内容:

  • 对表的引用
  • 子查询和 SQL 语句,如 SELECTCREATEUPDATE
  • 用户定义的函数、聚合函数或分析函数
  • 以下标量函数:
    • ARRAY_TO_STRING
    • REPLACE
    • REGEXP_REPLACE
    • RAND
    • FORMAT
    • LPAD
    • RPAD
    • REPEAT
    • SESSION_USER
    • GENERATE_ARRAY
    • GENERATE_DATE_ARRAY

设置 VALUE 会替换视图上该选项的现有值(如果有)。将 VALUE 设置为 NULL 会清除视图上该选项的值。

示例

设置视图上的到期时间戳和说明

以下示例将视图的到期时间戳设置为执行 ALTER VIEW 语句后七天,同时设置了说明:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     ALTER VIEW mydataset.myview
     SET OPTIONS (
       expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY),
       description="View that expires seven days from now"
     )
     

  4. 点击运行

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     ALTER VIEW mydataset.myview
     SET OPTIONS (
       expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY),
       description="View that expires seven days from now"
     )
     

  4. 点击 Run Query

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
ALTER VIEW mydataset.myview
SET OPTIONS (
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY),
  description="View that expires seven days from now"
)'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

DROP TABLE 语句

如需在 BigQuery 中删除表,请使用 DROP TABLE DDL 语句。

语法

{DROP TABLE | DROP TABLE IF EXISTS}
table_name

其中:

{DROP TABLE | DROP TABLE IF EXISTS} 是下述语句之一:

  • DROP TABLE - 删除指定数据集中的一个表
  • DROP TABLE IF EXISTS - 仅当指定数据集中存在指定的表时才将其删除

table_name 是您要删除的表的名称。

示例

删除表

DROP TABLE DDL 语句删除指定数据集中的表。如果数据集内不存在表名称,会返回以下错误:

Error: Not found: Table myproject:mydataset.mytable

如果要删除其他项目中的表,则必须按以下格式指定项目、数据集和表:`project_id.dataset.table`(包括反引号);例如 `myproject.mydataset.mytable`

如需使用 DDL 删除表,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     DROP TABLE mydataset.mytable
     

  4. 点击运行。查询完成后,系统将从资源窗格中移除该表。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     DROP TABLE mydataset.mytable
     

  4. 点击 Run query。查询完成后,系统将从导航窗格中移除该表。

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
DROP TABLE mydataset.mytable'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

仅当表存在时才删除表

DROP TABLE IF EXISTS DDL 语句仅在表存在时删除指定数据集中的表。如果数据集内不存在表名称,则不会返回任何错误,也不会执行任何操作。

如果要删除其他项目中的表,则必须按以下格式指定项目、数据集和表:`project_id.dataset.table`(包括反引号);例如 `myproject.mydataset.mytable`

如需仅在表存在时才使用 DDL 删除表,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     DROP TABLE IF EXISTS mydataset.mytable
     

  4. 点击运行。查询完成后,系统将从资源窗格中移除该表。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     DROP TABLE IF EXISTS mydataset.mytable
     

  4. 点击 Run query。查询完成后,系统将从导航窗格中移除该表。

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
DROP TABLE IF EXISTS mydataset.mytable'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

DROP VIEW 语句

如需在 BigQuery 中删除视图,请使用 DROP VIEW DDL 语句。

语法

{DROP VIEW | DROP VIEW IF EXISTS}
view_name

其中:

{DROP VIEW | DROP VIEW IF EXISTS} 是下述语句之一:

  • DROP VIEW - 删除指定数据集中的一个视图
  • DROP VIEW IF EXISTS - 仅当指定数据集中存在指定的视图时才将其删除

view_name 是您要删除的视图的名称。

示例

删除视图

DROP VIEW DDL 语句删除指定数据集中的表。如果数据集内不存在视图名称,会返回以下错误:

Error: Not found: Table myproject:mydataset.myview

如果要删除其他项目中的表,则必须按以下格式指定项目、数据集和视图:`project_id.dataset.table`(包括反引号);例如 `myproject.mydataset.myview`

如需使用 DDL 删除视图,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     DROP VIEW mydataset.myview
     

  4. 点击运行。查询完成后,系统将从资源窗格中移除该视图。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     DROP VIEW mydataset.myview
     

  4. 点击 Run query。查询完成后,系统将从导航窗格中移除该视图。

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
DROP VIEW mydataset.myview'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

仅当视图存在时才删除视图

DROP VIEW IF EXISTS DDL 语句仅在视图存在时删除指定数据集中的视图。如果数据集内不存在视图名称,则不会返回任何错误,也不会执行任何操作。

如果要删除其他项目中的表,则必须按以下格式指定项目、数据集和视图:`project_id.dataset.table`,(包括反引号);例如 `myproject.mydataset.myview`

如需仅在视图存在时才使用 DDL 删除视图,请执行以下操作:

控制台

  1. 在 GCP Console 中打开 BigQuery 网页界面。
    转到 GCP Console

  2. 点击编写新查询

    编写新查询

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     DROP VIEW IF EXISTS mydataset.myview
     

  4. 点击运行。查询完成后,系统将从资源窗格中移除该视图。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 Compose query

  3. New Query 文本区域中输入 DDL 语句。

     #standardSQL
     DROP VIEW IF EXISTS mydataset.myview
     

  4. 点击 Run query。查询完成后,系统将从导航窗格中移除该视图。

CLI

输入 bq query 命令并提供 DDL 语句作为查询参数。

bq query --use_legacy_sql=false '
DROP VIEW IF EXISTS mydataset.myview'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。 statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:创建 DDL 目标的查询。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而且表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

DROP FUNCTION 语句

语法

DROP FUNCTION [ IF EXISTS ] [`project_name`.]dataset_name.function_name

说明

删除数据集 dataset_name 中的函数 function_name

可选子句

IF EXISTS:仅当指定数据集内存在指定的函数时才将其删除。

project_name:指定包含该函数的项目。如果该函数不属于当前项目,则必须提供 project_name

示例

以下示例语句会删除数据集 mydataset 中包含的函数 parseJsonAsStruct

DROP FUNCTION mydataset.parseJsonAsStruct;

以下示例语句会删除项目 other_project 的数据集 sample_dataset 中的函数 parseJsonAsStruct

DROP FUNCTION `other_project`.sample_dataset.parseJsonAsStruct;
此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面