设置分区投影
在表的属性中设置分区投影是一个包含两个步骤的过程:
-
指定每个分区列的数据范围和相关模式,或使用自定义模板。
-
为表启用分区投影。
注意
在向现有表添加分区投影属性之前,要为其设置分区投影属性的分区列必须已存在于表架构中。如果分区列尚不存在,则必须将分区列手动添加到现有表中。AWS Glue 不会自动为您执行此步骤。
本节介绍如何为 AWS Glue 设置表属性。要设置这些表属性,您可以使用 AWS Glue 控制台、Athena CREATE TABLE 查询或 AWS Glue API 操作。以下过程说明如何在 AWS Glue 控制台中设置属性。
要使用 AWS Glue 控制台配置并启用分区投影
登录 AWS Management Console,然后打开 AWS Glue 控制台,网址为:https://console.aws.amazon.com/glue/
。 -
选择 Tables (表) 选项卡。
在 Tables (表) 选项卡上,您可以编辑现有表,也可以选择 Add tables (添加表) 来创建新表。有关手动添加表或使用爬网程序添加表的信息,请参阅《AWS Glue 开发人员指南》中的在 AWS Glue 控制台上使用表。
-
在表的列表中,选择要编辑的表的链接。
-
依次选择 Actions(操作)、Edit table(编辑表)。
-
在 Edit table(编辑表)页面的 Table properties(表属性)部分中,对于每个分区列,添加以下键值对:
-
对于 Key (键),添加
projection.
。columnName
.type -
对于 Value (值),添加受支持的类型之一:
enum
、integer
、date
或injected
。有关更多信息,请参阅 受支持的分区投影类型。
-
-
按照受支持的分区投影类型中的指导信息进行操作,根据配置要求添加其他键/值对。
以下示例表配置将为分区投影配置
year
列,从而将可返回的值限定为 2010 年至 2016 年的数据。 -
添加键/值对以启用分区投影。对于 Key (键),输入
projection.enabled
,对于其 Value (值),输入true
。注意
您可以随时通过将
projection.enabled
设置为false
来对此表禁用分区投影。 -
完成后,选择 Save。
-
在 Athena 查询编辑器中,测试查询为表配置的列。
以下示例查询使用
SELECT DISTINCT
从year
列返回唯一值。数据库包含 1987 年至 2016 年的数据,但projection.year.range
属性将返回的值限定为 2010 年至 2016 年的数据。注意
如果将
projection.enabled
设置为true
,但未能配置一个或多个分区列,则会收到与以下内容类似的错误消息:HIVE_METASTORE_ERROR: Table
.database_name
.table_name
is configured for partition projection, but the following partition columns are missing projection configuration: [column_name
] (tabledatabase_name
.table_name
)
如何指定自定义 S3 存储位置
在 AWS Glue 中编辑表属性时,还可以为投影分区指定自定义 Amazon S3 路径模板。利用自定义模板,Athena 可以将分区值正确映射到未遵循典型 .../column=value/...
模式的自定义 Amazon S3 文件位置。
可以选择使用自定义模板。但是,如果您使用自定义模板,则该模板中必须为每个分区列包含一个占位符。模板化位置必须以正斜杠结尾,以便分区的数据文件位于每个分区的“文件夹”中。
指定自定义分区位置模板
-
按照步骤使用 AWS Glue 控制台配置并启用分区投影,添加一个指定自定义模板的附加键/值对,如下所示:
-
对于键,输入
storage.location.template
。 -
对于 Value (值),指定一个位置,该位置为每个分区列包含一个占位符。确保每个占位符(和 S3 路径本身)都以单个正斜杠结束。
以下示例模板值假定一个具有分区列
a
、b
和c
的表。s3://amzn-s3-demo-bucket/table_root/a=${a}/${b}/some_static_subdirectory/${c}/
s3://amzn-s3-demo-bucket/table_root/c=${c}/${b}/some_static_subdirectory/${a}/${b}/${c}/${c}/
对于同一个表,以下示例模板值无效,因为它不包含列
c
的占位符。s3://amzn-s3-demo-bucket/table_root/a=${a}/${b}/some_static_subdirectory/
-
-
选择 应用。