使用架构自动检测功能

架构自动检测

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

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

要查看检测到的表架构,请如下操作:

  • 使用命令行工具的 bq show 命令
  • 通过 BigQuery 网页界面查看表的架构

如果 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 网页界面。
    转到 BigQuery 网页界面

  2. 从导航面板的资源部分选择数据集。点击窗口右侧的创建表

    创建表

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

    • 基于以下数据创建表部分,选择所需的来源类型。

      创建表来源

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

      选择文件

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

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

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

      选择数据集

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

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

  5. 点击创建表

经典版界面

  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 从本地机器加载到 mydataset 数据集内存储的 mytable 表中,其中 mydataset 是在 US 多区域位置中创建的。

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

输入以下命令,将 myfile.csv 从本地机器加载到 mydataset 数据集内存储的 mytable 表中,其中 mydataset 是在 asia-northeast1 区域中创建的。

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

API

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

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

  3. 使用 configuration.load.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
此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

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