加载外部分区数据

BigQuery 可以使用 Hive 分区布局加载 Cloud Storage 中存储的数据。Hive 分区是指将外部数据整理成多个文件,并采用命名惯例将文件分隔到不同的分区。如需了解详情,请参阅支持的数据布局

默认情况下,数据不会在 BigQuery 中进行分区,除非您明确创建分区表

加载 Hive 分区数据

如需加载 Hive 分区数据,请选择以下选项之一:

控制台

  1. 在 Google Cloud 控制台中,找到 BigQuery

    转到 BigQuery

  2. 浏览器窗格中,展开您的项目,然后选择数据集。
  3. 点击 查看操作,然后点击创建表。此时将打开创建表窗格。
  4. 来源部分,指定以下详细信息:
    1. 基于以下数据创建表部分,选择 Google Cloud Storage
    2. 从 Cloud Storage 存储桶中选择文件部分,使用通配符输入 Cloud Storage 文件夹的路径。例如 my_bucket/my_files*。Cloud Storage 存储桶必须与您要创建、附加或覆盖的表所属的数据集位于同一位置。
    3. 文件格式列表中,选择文件类型。
    4. 选中源数据分区复选框,然后在选择源 URI 前缀部分,输入 Cloud Storage URI 前缀。例如,gs://my_bucket/my_files
    5. 分区推理模式部分中,选择以下选项之一:
      • 自动推断类型:用于将分区架构检测模式设置为 AUTO
      • 所有列都是字符串:用于将分区架构检测模式设置为 STRINGS
      • 自主提供:用于将分区架构检测模式设置为 CUSTOM,并手动输入分区键的架构信息。如需了解详情,请参阅提供自定义分区键架构
    6. 可选:如需要求对此表的所有查询使用分区过滤条件,请选中要求使用分区过滤条件复选框。要求使用分区过滤条件可以减少费用并提高性能。如需了解详情,请参阅要求对查询中的分区键使用谓词过滤条件
  5. 目标部分,指定以下详细信息:
    1. 对于项目,选择要在其中创建表的项目。
    2. 对于数据集,选择您要在其中创建表的数据集。
    3. 对于,输入您要创建的表的名称。
    4. 对于表类型,选择原生表
  6. 架构部分,输入架构定义。
  7. 如需启用对架构的自动检测,请选择自动检测
  8. 如需忽略额外列值与架构不匹配的行,请展开高级选项部分,然后选择未知值
  9. 点击创建表

SQL

如需创建外部分区表,请使用 LOAD DATA 语句WITH PARTITION COLUMNS 子句指定分区架构的详细信息。

如需查看示例,请参阅加载在外部分区的文件

bq

使用自动分区键类型检测加载 Hive 分区数据:

bq load --source_format=ORC --hive_partitioning_mode=AUTO \
--hive_partitioning_source_uri_prefix=gcs_uri_shared_prefix \
dataset.table gcs_uris

使用字符串类型分区键检测加载 Hive 分区数据:

bq load --source_format=CSV --autodetect \
--hive_partitioning_mode=STRINGS \
--hive_partitioning_source_uri_prefix=gcs_uri_shared_prefix \
dataset.table gcs_uris

使用通过 source\_uri\_prefix 字段编码的自定义分区键架构加载 Hive 分区数据:

bq load --source_format=JSON --hive_partitioning_mode=CUSTOM \
--hive_partitioning_source_uri_prefix=gcs_uri_shared_prefix/partition_key_schema \
dataset.table gcs_uris file_schema

分区键架构的编码紧跟在源 URI 前缀之后。请使用以下格式指定 --hive_partitioning_source_uri_prefix

--hive_partitioning_source_uri_prefix=gcs_uri_shared_prefix/{key1:TYPE1}/{key2:TYPE2}/{key3:TYPE3}

API

通过在 JobConfigurationLoad 上设置 HivePartitioningOptions,即可支持 Hive 分区。

执行增量加载

请考虑以下数据布局:

gs://my_bucket/my_table/dt=2019-10-31/val=1/file1
gs://my_bucket/my_table/dt=2018-10-31/val=2/file2
gs://my_bucket/my_table/dt=2017-10-31/val=3/file3
gs://my_bucket/my_table/dt=2016-10-31/val=4/file4

如需仅加载 2019-10-31 的数据,请执行以下操作:

  • Hive 分区模式设置为 AUTOSTRINGSCUSTOM
  • 对于 AUTOSTRINGS Hive 分区模式,请将源 URI 前缀设置为 gs://my_bucket/my_table/。对于 CUSTOM,请提供 gs://my_bucket/my_table/{dt:DATE}/{val:INTEGER}
  • 使用 URI gs://my_bucket/my_table/dt=2019-10-31/*
  • 加载数据时包含 dtval 列,值分别为 2019-10-311

如需仅加载特定文件中的数据,请执行以下操作:

  • Hive 分区模式设置为 AUTOSTRINGSCUSTOM
  • 对于 AUTOSTRINGS Hive 分区模式,请将源 URI 前缀设置为 gs://my_bucket/my_table/。对于 CUSTOM,请提供 gs://my_bucket/my_table/{dt:DATE}/{val:INTEGER}
  • 使用 URI gs://my_bucket/my_table/dt=2017-10-31/val=3/file3,gs://my_bucket/my_table/dt=2016-10-31/val=4/file4
  • 从两个文件中加载数据,其中 dtval 列已填充。

分区架构

以下部分介绍了 BigQuery 支持的默认 Hive 分区布局架构检测模式

支持的数据布局

从 Cloud Storage 查询数据时,Hive 分区键会以普通列的形式显示。数据必须遵循默认 Hive 分区布局。例如,以下文件采用默认布局,其中键值对以目录的方式配置,使用等号 (=) 作为分隔符,且分区键的顺序始终相同:

gs://my_bucket/my_table/dt=2019-10-31/lang=en/my_filename
gs://my_bucket/my_table/dt=2018-10-31/lang=fr/my_filename

此示例中使用的共同源 URI 前缀为 gs://my_bucket/my_table

不支持的数据布局

如果分区键名未在目录路径中进行编码,则分区架构检测将失败。例如,请考虑以下路径,该路径未对分区键的名称进行编码:

gs://my_bucket/my_table/2019-10-31/en/my_filename

架构顺序不一致的文件也会导致检测失败。例如,请考虑以下两个文件,它们采用的分区键编码是反向的:

gs://my_bucket/my_table/dt=2019-10-31/lang=en/my_filename
gs://my_bucket/my_table/lang=fr/dt=2018-10-31/my_filename

检测模式

BigQuery 支持三种 Hive 分区架构检测模式:

  • AUTO:系统会自动检测键的名称和类型。 可以检测以下类型:

  • STRINGS:键名会自动转换为 STRING 类型。

  • CUSTOM:分区键架构按照源 URI 前缀中指定的方式进行编码。

自定义分区键架构

如需使用 CUSTOM 架构,您必须在源 URI 前缀字段中指定架构。使用 CUSTOM 架构,您可以指定每个分区键的类型。值必须有效地解析为指定类型,否则查询将会失败。

例如,如果您将 source_uri_prefix 标志设置为 gs://my_bucket/my_table/{dt:DATE}/{val:STRING},则 BigQuery 会将 val 视为 STRING,将 dt 视为 DATE,并使用 gs://my_bucket/my_table 作为匹配文件的源 URI 前缀。

限制

  • 如需构建 Hive 分区支持,所有 URI 都应使用共同的源 URI 前缀,且该前缀的后面应紧跟分区编码,如下所示:gs://BUCKET/PATH_TO_TABLE/
  • Hive 分区表的目录结构应以相同顺序显示相同的分区键,且每个表的分区键数不得超过 10 个。
  • 数据必须遵循默认 Hive 分区布局
  • 底层文件中的 Hive 分区键和列不能重叠。
  • 仅支持 GoogleSQL

  • 需遵守从 Cloud Storage 加载的所有限制

后续步骤