使用外部分区数据
您可以使用 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
:系统会自动检测键的名称和类型。 可检测到以下类型的键:STRING
、INTEGER
、DATE
和TIMESTAMP
。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 中的外部数据源相关的所有限制。
后续步骤
- 了解分区表。
- 了解如何在 BigQuery 中使用 SQL。