加载外部分区数据
BigQuery 可以使用 Hive 分区布局加载 Cloud Storage 中存储的数据。Hive 分区是指将外部数据整理成多个文件,并采用命名惯例将文件分隔到不同的分区。如需了解详情,请参阅支持的数据布局。
默认情况下,数据不会在 BigQuery 中进行分区,除非您明确创建分区表。
加载 Hive 分区数据
如需加载 Hive 分区数据,请选择以下选项之一:
控制台
在 Google Cloud 控制台中,找到 BigQuery。
- 在浏览器窗格中,展开您的项目,然后选择数据集。
- 点击 查看操作,然后点击创建表。此时将打开创建表窗格。
- 在来源部分,指定以下详细信息:
- 在基于以下数据创建表部分,选择 Google Cloud Storage。
- 在从 Cloud Storage 存储桶中选择文件部分,使用通配符输入 Cloud Storage 文件夹的路径。例如
my_bucket/my_files*
。Cloud Storage 存储桶必须与您要创建、附加或覆盖的表所属的数据集位于同一位置。 - 从文件格式列表中,选择文件类型。
- 选中源数据分区复选框,然后在选择源 URI 前缀部分,输入 Cloud Storage URI 前缀。例如,
gs://my_bucket/my_files
。 - 在分区推理模式部分中,选择以下选项之一:
- 自动推断类型:用于将分区架构检测模式设置为
AUTO
。 - 所有列都是字符串:用于将分区架构检测模式设置为
STRINGS
。 - 自主提供:用于将分区架构检测模式设置为
CUSTOM
,并手动输入分区键的架构信息。如需了解详情,请参阅提供自定义分区键架构。
- 自动推断类型:用于将分区架构检测模式设置为
- 可选:如需要求对此表的所有查询使用分区过滤条件,请选中要求使用分区过滤条件复选框。要求使用分区过滤条件可以减少费用并提高性能。如需了解详情,请��阅要求对查询中的分区键使用谓词过滤条件。
- 在目标部分,指定以下详细信息:
- 对于项目,选择要在其中创建表的项目。
- 对于数据集,选择您要在其中创建表的数据集。
- 对于表,输入您要创建的表的名称。
- 对于表类型,选择原生表。
- 在架构部分,输入架构定义。
- 如需启用对架构的自动检测,请选择自动检测。
- 如需忽略额外列值与架构不匹配的行,请展开高级选项部分,然后选择未知值。
- 点击创建表。
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 分区模式设置为
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/*
。 - 加载数据时包含
dt
和val
列,值分别为2019-10-31
和1
。
如需仅加载特定文件中的数据,请执行以下操作:
- 将 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
。 - 从两个文件中加载数据,其中
dt
和val
列已填充。
分区架构
以下部分介绍了 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 前缀。
限制
- 如需构建 Hive 分区支持,所有 URI 都应使用共同的源 URI 前缀,且该前缀的后面应紧跟分区编码,如下所示:
gs://BUCKET/PATH_TO_TABLE/
。 - Hive 分区表的目录结构应以相同顺序显示相同的分区键,且每个表的分区键数不得超过 10 个。
- 数据必须遵循默认 Hive 分区布局。
- 底层文件中的 Hive 分区键和列不能重叠。
仅支持 GoogleSQL。
后续步骤
- 了解分区表。
- 了解如何在 BigQuery 中使用 SQL。