使用外部分区数据

您可以使用 BigQuery 外部表查询以下数据存储区中的分区数据:

外部分区数据必须使用默认 Hive 分区布局,并采用以下格式之一:

  • Avro
  • CSV
  • JSON
  • ORC
  • Parquet

如需查询外部分区数据,您必须创建 BigLake 表外部表。我们建议您使用 BigLake 表,因为这样就可以在表级层强制执行精细的安全措施。如需了解 BigLake 和外部表,请参阅 BigLake 表简介外部表简介

您可以通过设置表定义文件中的相应选项来启用 Hive 分区支持。 如需了解如何查询代管式分区表,请参阅分区表简介

分区架构

以下部分介绍了 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:系统会自动检测键的名称和类型。 可检测到以下类型的键:STRINGINTEGERDATETIMESTAMP
  • 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 前缀。

删减分区

BigQuery 会尽可能使用分区键中的查询谓词来剪除分区。这可让 BigQuery 避免读取不必要的文件,从而有助于提高性能。

对查询中的分区键使用的谓词过滤条件

创建外部分区表时,您可以通过启用 HivePartitioningOptions 下的 requirePartitionFilter 选项,要求对分区键使用谓词过滤条件。

启用此选项时,如果试图在不指定 WHERE 子句的情况下查询外部分区表,则会产生以下错误:Cannot query over table <table_name> without a filter over column(s) <partition key names> that can be used for partition elimination

限制

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

  • 必须遵循与查询存储在 Cloud Storage 中的外部数据源相关的所有限制

后续步骤