使用分区索引 - Amazon连接词
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用分区索引

随着时间的推移,数十万个分区被添加到表中。这些区域有:获取分区 API用于获取表中的分区。API 返回与请求中提供的表达式匹配的分区。

让我们采取销售数据表作为一个由键分区的示例国家/地区类别年代, 和。如果您想获取销售的所有项目的销售数据Books年份中的类别2020,你必须创建一个GetPartitions请求与表达式 “类别 = 书籍和年份 = 2020” 到数据目录。

如果表中没有分区索引,Amazon Glue加载表的所有分区,然后使用用户在GetPartitions请求. 随着没有索引的表上的分区数量增加,查询需要更多的时间才能运行。对于索引,GetPartitions查询将尝试获取分区的子集,而不是加载表中的所有分区。

关于分区索引

当您创建分区索引时,请指定给定表中已存在的分区键列表。分区索引是表中定义的分区键的子列表。可以在表中定义的分区键的任何排列上创建分区索引。对于以上销售数据表中,可能的索引是(国家、类别、年份、月份)、(国家、类别、年份)、(国家、类别)、(国家)、(类别、国家、年份、月份)等。

数据目录将按照创建索引时提供的顺序连接分区值。将分区添加到表中时,索引的构建始终如一。可以为字符串和数字(int、bigint、长、细整和小整型)列类型创建索引。例如,对于具有分区键的表country(字符串),item(字符串),creationDate(日期),则无法在分区键上创建索引creationDate

数字数据类型的索引支持 =、>、>=、<、<= 以及运算符之间的索引。字符串数据类型仅支持等于 (=) 运算符。索引解决方案目前仅支持AND逻辑运算符。在使用索引过滤的表达式中,将忽略带有运算符 “LIKE”、“IN”、“OR” 和 “NOT” 的子表达式。对被忽略的子表达式的筛选是在应用索引过滤后获取的分区上完成的。

对于添加到表的每个分区,都会创建一个相应的索引项。对于具有 'n' 分区的表,1 个分区索引将生成 'n' 分区索引项。 同一表上的 'm' 分区索引将生成 'm*n' 分区索引项。每个分区索引项将根据当前Amazon Glue数据目录存储的定价策略。有关存储对象定价的详细信息,请参阅Amazon Glue定价

使用分区索引创建表

您可以在表创建过程中创建分区索引。这些区域有:CreateTable请求需要一个PartitionIndexobjects作为输入。在给定的表上最多可以创建 3 个分区索引。每个分区索引都需要一个名称和partitionKeys为表定义。在表上创建的索引可以使用GetPartitionIndexesAPI

将分区索引添加到现有表

要将分区索引添加到现有表,请使用CreatePartitionIndexoperation. 您可以创建一个PartitionIndex/CreatePartitionIndexoperation. 添加索引不会影响表的可用性,因为在创建索引期间该表继续可用。

添加分区的索引状态设置为 CREATE,并开始创建索引数据。如果创建索引的过程成功,则 “索引状态” 将更新为 “活动”,对于不成功的进程,索引状态将更新为 “失败”。索引创建可能会因多种原因而失败,您可以使用GetPartitionIndexes操作以检索失败详细信息。可能的故障包括:

  • 加密分区错误 — 不支持在具有加密分区的表上创建索引。

  • 无效分区类型数据错误 — 在partitionKey值对于相应的partitionKey数据类型。例如:partitionKey与 'int' 数据类型有一个值 'foo'。

  • 缺失分区值 _ 错误 — 当partitionValue用于indexedKey不存在。当表没有一致地进行分区时,就会发生这种情况。

  • 不支持分区字符错误 — 当索引分区键的值包含字符\ u0000、\ u0001 或\ u0002 时观察到

  • INTERAL_ERROR — 在创建索引时发生内部错误。

描述表上的分区索引

要获取在表上创建的分区索引,请使用GetPartitionIndexesoperation. 响应将返回表上的所有索引以及每个索引的当前状态(IndexStatus)。

这些区域有:IndexStatus分区索引将是以下内容之一:

  • CREATING— 索引当前正在创建,但是还不能使用。

  • ACTIVE— 索引已准备就绪,可供使用。请求可以使用索引执行优化查询。

  • DELETING— 索引当前正在删除,且不能再使用。处于活动状态的索引可以使用DeletePartitionIndex请求,该请求将状态从 “活动” 移动到 “删除”。

  • FAILED— 在现有表上创建索引失败。每个表存储最后 10 个失败的索引。

在现有表上创建的索引的可能状态转换包括:

  • 创建 → 活动 → 删除

  • 创建 → 失败

使用分区索引的限制

创建分区索引后,请注意对表和分区功能的以下更改:

创建新分区(添加索引后)

在表上创建分区索引后,将验证添加到表中的所有新分区,以进行索引键的数据类型检查。索引键的分区值将被验证为数据类型格式。如果数据类型检查失败,则创建分区操作将失败。对于销售数据表中,如果为键(类别,年份)创建索引,其类别类型为string和类型的年份int,则创建具有 YEAR 值为 “foo” 的新分区将失败。

启用索引后,添加具有索引键值的分区将开始失败,字符为 U+0000、U+00001 和 U+0002。

表更新

在表上创建分区索引后,您无法修改现有分区键的分区键名称,也不能更改在索引中注册的键的类型或顺序。

有限 Support

来自 EMR、Redshift 频谱和Amazon GlueETL Spark DataFrames 能够利用索引来获取分区。目前,Athena 和Amazon GlueETL DynamicFrames 不使用索引来获取分区。

使用索引进行优化的获取分区调用

当您调用GetPartitions,则可以包含表达式,如果适用,数据目录将使用索引(如果可能)。索引的第一个键应在表达式中传递,以便在筛选中使用的索引。过滤中的索引优化是作为最大努力应用的。Data Catalog 尝试尽可能多地使用索引优化,但是在缺少索引或不支持的运算符的情况下,它会回退到加载所有分区的现有实现。

对于销售数据表,让我们添加索引 [国家,类别,年]。如果表达式中未传递 “国家”,则注册的索引将无法使用索引过滤分区。您最多可以添加 3 个索引来支持各种查询模式。

让我们举一些示例表达式,看看索引是如何处理它们的:

表达式 如何使用索引

国家 = '美国'

索引将用于过滤分区。

国家/地区 = “美国” 和类别 = “鞋”

索引将用于过滤分区。

类别 = '鞋子'

索引将不会被用作表达式中未提供 “国家”。所有分区都将被加载以返回响应。

国家/地区 = “美国”,类别 = “鞋” 和年份 > “2018”

索引将用于过滤分区。

国家/地区 = “美国”,类别 = “鞋”,年份 > “2018”,月份 = 2

索引将用于获取国家/地区 = “美国”,类别 = “鞋” 和年份 > 2018 的所有分区。然后,将在月份表达式上执行过滤。

国家/地区 = “美国” 和类别 = “鞋” 或年份 > “2018”

索引不会用作OR运算符存在于表达式中。

国家/地区 = “美国” 和类别 = “鞋” 和(年份 = 2017 年或年份 = “2018”)

索引将用于获取国家 = “US” 和类别 = “鞋子” 的所有分区,然后对年份表达式进行过滤。

所在的国家(“美国”,“英国”)和类别 = “鞋”

索引将不用于过滤,因为IN当前不支持。