使用架构自动检测功能

架构自动检测

在将数据加载到 BigQuery 以及查询外部数据源时,您可以使用架构自动检测功能。

启用自动检测功能后,BigQuery 按以下方式开始推理过程:在数据源中随机选择一个文件,然后扫描多达 100 行数据以用作代表性样本。BigQuery 接着检查每个字段,并尝试根据样本中的值向该字段分配数据类型。

如需查看检测到的表架构,请使用以下方法:

  • 使用命令行工具的 bq show 命令
  • 使用 GCP Console 或经典版网页界面查看表架构

如果 BigQuery 检测到架构,则在极少数的情况下可能会更改字段名称,使其与 BigQuery SQL 语法兼容。

如需了解数据类型转换,请参阅以下内容:

在加载数据时使用架构自动检测功能

要在加载数据时实现架构自动检测,请如下操作:

  • GCP Console:在架构部分,针对自动检测,请勾选架构和输入参数选项。
  • 经典版 BigQuery 网页界面:在 Schema 部分,勾选 Automatically detect 选项。
  • CLI:使用带 --autodetect 参数的 bq load 命令。

启用后,BigQuery 将尽可能尝试自动推断出 CSV 和 JSON 文件的架构。

架构自动检测功能不适用于 Avro 文件、Parquet 文件、ORC 文件、Cloud Firestore 导出文件或 Cloud Datastore 导出文件。在您将这些文件加载到 BigQuery 中时,系统会自动从自描述源数据中检索表架构。

如需在加载 JSON 或 CSV 数据时使用架构自动检测功能,请执行以下操作:

Console

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

  2. 从导航面板的资源部分选择数据集。

  3. 点击窗口右侧的创建表

    创建表

  4. 创建表页面的源位置部分,执行以下操作:

    • 基于以下数据创建表部分,选择所需的来源类型。
    • 在来源字段中,浏览并找到相应的文件/Cloud Storage 存储分区,或输入 Cloud Storage URI。请注意,BigQuery 网页界面不支持添加多个 URI,但支持使用通配符。Cloud Storage 存储分区必须与您要创建的表所属的数据集位于同一位置。

      选择文件

    • 文件格式部分中,选择 CSVJSON

  5. 创建表页面的目标位置部分,执行以下操作:

    • 数据集名称部分,选择相应数据集。

      选择数据集

    • 表名称字段中,输入您要创建的表的名称。

    • 确认表类型是否设置为原生表

  6. 点击创建表

经典版界面

  1. 转到 BigQuery 网页界面。
    转到 BigQuery 网页界面

  2. 在导航窗格中,点击数据集名称旁边的向下箭头图标 向下箭头图标,然后点击 Create new table

    注意:在界面中,数据加载过程与表的创建过程相同。
  3. Create table 页面上,执行以下操作:

    • 对于 Source Data,点击 Create from source
    • 对于 Destination Table,选择您的数据集并在 Destination table name 字段中输入表名。
    • 对于 Schema,点击 Automatically detect 来确定架构。

      “自动检测”链接

    • 点击 Create Table

CLI

发出带 --autodetect 参数的 bq load 命令。

(可选)添加 --location 标志并将其值设置为您的位置

以下命令通过架构自动检测功能加载文件:

bq --location=location load \
--autodetect \
--source_format=format \
dataset.table \
path_to_source

其中:

  • location 是您位置的名称--location 是可选标志。例如,如果您在东京区域使用 BigQuery,请将该标志的值设置为 asia-northeast1。您可以使用 .bigqueryrc 文件设置位置的默认值。
  • format 是 NEWLINE_DELIMITED_JSONCSV
  • dataset 是一个数据集,它包含您要将数据加载到其中的表。
  • table 是要向其中加载数据的表的名称。
  • path_to_source 是 CSV 或 JSON 文件的位置。

示例:

输入以下命令可以将本地机器上的 myfile.csv 加载到名为 mytable 的表中,该表存储在名为 mydataset 的数据集中。

bq load --autodetect --source_format=CSV mydataset.mytable ./myfile.csv

输入以下命令可以将本地机器上的 myfile.csv 加载到名为 mytable 的表中,该表存储在名为 mydataset 的数据集中。

bq load --autodetect --source_format=CSV mydataset.mytable ./myfile.csv

API

  1. 创建指向源数据的 load 作业。如需了解如何创建作业,请参阅以编程方式运行 BigQuery 作业。在 jobReference 部分的 location 属性中指定您的位置。

  2. 设置 sourceFormat 属性以指定数据格式。要使用架构自动检测功能,必须将此值设置为 NEWLINE_DELIMITED_JSONCSV

  3. 使用 autodetect 属性将架构自动检测功能设置为 true

Go

试用此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Go 设置说明进行操作。如需了解详情,请参阅 BigQuery Go API 参考文档

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states.json")
gcsRef.SourceFormat = bigquery.JSON
gcsRef.AutoDetect = true
loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)
loader.WriteDisposition = bigquery.WriteEmpty

job, err := loader.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}

if status.Err() != nil {
	return fmt.Errorf("Job completed with error: %v", status.Err())
}

Python

试用此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

如需启用架构自动检测功能,请将 LoadJobConfig.autodetect 属性设置为 True

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_id = 'my_dataset'

dataset_ref = client.dataset(dataset_id)
job_config = bigquery.LoadJobConfig()
job_config.autodetect = True
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON
uri = "gs://cloud-samples-data/bigquery/us-states/us-states.json"
load_job = client.load_table_from_uri(
    uri, dataset_ref.table("us_states"), job_config=job_config
)  # API request
print("Starting job {}".format(load_job.job_id))

load_job.result()  # Waits for table load to complete.
print("Job finished.")

destination_table = client.get_table(dataset_ref.table("us_states"))
print("Loaded {} rows.".format(destination_table.num_rows))

针对外部数据源的架构自动检测

要在创建链接到外部数据源的表时启用架构自动检测功能,请执行以下操作:

  • 在 GCP Console 中,针对自动检测,勾选架构和输入参数选项。
  • 在传统版 BigQuery 网页界面中,勾选 Automatically detect 选项。

启用后,BigQuery 将尽可能尝试自动推断出 CSV 和 JSON 外部数据源的架构。

目前,您无法使用 GCP Console 或经典版网页界面为 Google 表格外部数据源启用架构自动检测功能。此外,架构自动检测功能不适用于外部 Avro 文件、Cloud Firestore 导出文件或 Cloud Datastore 导出文件。在创建链接到这些文件类型之一的表时,BigQuery 会自动从自描述源数据中检索架构。

借助 CLI,可在为 CSV、JSON 或 Google 表格数据创建表定义文件时启用架构自动检测。使用 CLI 创建表定义文件时,您可将 --autodetect 标志传递给 mkdef 命令来启用架构自动检测,或者传递 --noautodetect 标志来禁用自动检测。

使用 --autodetect 标志时,autodetect 设置在表定义文件中设定为 true。使用 --noautodetect 标志时,"autodetect" 设置设定为 false。如果您在创建表定义时未提供外部数据源的架构定义,且未使用 --noautodetect--autodetect 标志,则 "autodetect" 设置默认为 true

使用 API 创建表定义文件时,请将 autodetect 属性的值设置为 truefalse。将 autodetect 设置为 true 可启用自动检测功能。将 autodetect 设置为 false 可将其停用。

自动检测详述

除了检测架构详细信息外,自动检测还可识别以下内容:

压缩

打开文件时,BigQuery 会识别与 gzip 兼容的文件压缩。

CSV 分隔符

BigQuery 会检测以下分隔符:

  • 逗号 (,)
  • 竖线 (|)
  • 制表符 (\t)

CSV 标题

BigQuery 通过将文件的第一行与数据集中的其他行进行比较来推断出标题。如果第一行只包含字符串,而其他行不包含,则 BigQuery 假定第一行是标题行。

CSV 引用的新行

BigQuery 检测 CSV 域中引用的新行字符,但不将引用的新行字符解释为行边界。

日期

在对 JSON 或 CSV 数据使用架构检测功能时,DATE 列中的值必须使用短划线 (-) 分隔符,且必须采用 YYYY-MM-DD(年-月-日)格式。

时间戳

BigQuery 检测各种时间戳格式,包括但不限于:

  • yyyy-mm-dd
  • yyyy-mm-dd hh:mm:ss
  • yyyy-mm-dd hh:mm:ss.mmm

时间戳还可包含世界协调时间 (UTC) 偏移量和世界协调时间 (UTC) 区域指示符 Z,同时还支持基于整数的时间戳值。

在对 JSON 或 CSV 数据使用架构检测功能时,TIMESTAMP 列中的值必须在时间戳的日期部分使用短划线 (-) 分隔符,且日期必须采用 YYYY-MM-DD(年-月-日)格式。时间戳的 hh:mm:ss(时-分-秒)部分必须使用冒号 (:) 分隔符。

时间戳示例

BigQuery 自动检测到的时间戳格式示例如下:

  • 253402300799
  • 2018-07-05 12:54:00 UTC
  • 2018-08-19 07:11:35.220 -05:00
  • 2018-08-19 12:11:35.220 UTC
  • 2018-08-19T12:11:35.220Z
  • 2.53402300799e11
  • 2018-08-19 12:11:35.220000
  • 2018-08-19 12:11:35.220
此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

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