加载外部分区数据

BigQuery 支持使用默认 hive 分区布局AvroParquetORCCSVJSON 格式加载存储在 Cloud Storage 上的外部分区数据。

限制

  • 构建 hive 分区支持时,假设所有 URI 使用共同的源 URI 前缀,该前缀在分区编码前立即结束,类似于 gs://<bucket>/<path_to_table>/
  • 假定 hive 分区表的目录结构以相同顺序显示相同的分区键,每个表最多 10 个分区键。
  • 数据必须遵循默认 hive 分区布局
  • 底层文件中的 hive 分区键和列不能重叠。
  • 目前仅支持 CLI 和 REST API。
  • 需遵守从 Cloud Storage 加载的所有限制

支持的数据布局

数据必须遵循默认 hive 分区布局。例如,以下文件采用默认布局,键值对以目录的方式布置,其中 = 符号作为分隔符,并且分区键的顺序始终相同。

gs://bucket/table/dt=2019-10-31/lang=en/foo
gs://bucket/table/dt=2018-10-31/lang=fr/bar

不支持的数据布局

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

gs://bucket/table/2019-10-31/en/foo

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

gs://bucket/table/dt=2019-10-31/lang=en/foo
gs://bucket/table/lang=fr/dt=2018-10-31/bar

分区架构检测模式

从 Cloud Storage 加载数据时,hive 分区键以常规列的形式显示。我们支持三种 hive 分区架构检测模式:

  • AUTO:自动检测键名和类型。可检测到以下类型:STRING、INTEGER、DATE 和 TIMESTAMP。
  • STRINGS:自动推断 STRING 类型的键名。
  • CUSTOM:分区键架构在源 URI 前缀中进行编码。

提供自定义分区键架构

CUSTOM 检测需要通过提供分区键名/类型对,在源 URI 前缀字段中对架构进行编码。值必须有效地解析为指定类型,否则加载失败。

例如,将 source_uri_prefix 设置为 gs://my_bucket/my_table/{dt:DATE}/{val:STRING} 可将 val 视为 STRING,将 dt 视为 DATE,并提取 gs://my_bucket/my_table 作为匹配文件的源 URI 前缀。

请查看 CLIREST API 的详细说明。

执行增量加载

请考虑以下数据布局:

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 分区模式设置为 AUTO、STRINGS 或 CUSTOM
  • 对于 AUTO 或 STRINGS 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 分区模式设置为 AUTO、STRINGS 或 CUSTOM
  • 对于 AUTO 或 STRINGS 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 列已填充。

使用 CLI 设置 HivePartitioningOptions

请求自动分区键类型检测

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

请求字符串类型分区键检测

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

提供通过 source_uri_prefix 字段编码的自定义分区键架构

bq load --source_format=JSON --hive_partitioning_mode=CUSTOM \
--hive_partitioning_source_uri_prefix=gcs_uri_shared_prefix/custom_schema_encoding \
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}

使用 REST API 设置 HivePartitioningOptions

通过在 JobConfigurationLoad 上设置 HivePartitionOptions,即可支持 hive 分区。

请注意,当 hivePartitioningOptions.mode 设置为 CUSTOM 时,您必须将 hivePartitioningOptions.sourceUriPrefix 设置为 gs://bucket/path_to_table/{key1:TYPE1}/{key2:TYPE2}/{key3:TYPE3},以便在 sourceUriPrefix 中对分区键架构进行编码。