Lake Formation 中的数据筛选条件 - Amazon Lake Formation
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Lake Formation 中的数据筛选条件

您可以通过创建数据筛选条件来实现列级别、行级别和单元格级别安全性。在授予对表的 SELECT Lake Formation 权限时,您可以选择数据筛选条件。如果您的表包含嵌套列结构,则可以通过包含或排除子列来定义数据筛选条件,并针对嵌套属性定义行级别筛选表达式。

每个数据筛选条件属于数据目录中的一个特定表。数据筛选条件包含以下信息。

  • 筛选条件名称

  • 与筛选条件关联的表的目录 ID

  • 表名称

  • 包含表的数据库的名称

  • 列规范 – 要在查询结果中包含或排除的列和嵌套列的列表(使用 struct 数据类型)。

  • 行筛选表达式 – 用于指定要包含在查询结果中的行的表达式。由于实施一些限制,该表达式的语法与 PartiQL 语言中 WHERE 子句的语法相同。要指定所有行,请选择控制台的行级别访问下的访问所有行,或者在 API 调用中使用 AllRowsWildcard

    有关行筛选表达式支持哪些内容的更多信息,请参阅行筛选表达式支持 PartiQL

您获得的筛选级别取决于填充数据筛选器的方式。

  • 如果指定“所有列”通配符并提供行筛选条件表达式,则仅建立行级安全性(行筛选)。

  • 如果包含或排除特定列和嵌套列并使用“所有行”通配符指定所有行,则仅会建立列级别安全性(列筛选)。

  • 如果包含或排除特定列,同时提供行筛选条件表达式,则建立单元格级别的安全性(单元格筛选)。

以下来自 Lake Formation 控制台的屏幕截图显示了执行单元格级别筛选的数据筛选条件。对于针对 orders 表的查询,它会限制对 customer_name 列的访问,并且查询结果仅返回 product_type 列包含“pharma”的行。


        数据筛选条件窗口包含以下垂直排列的字段:“数据筛选条件名称”;“目标数据库”;“目标表”;选项按钮组,其中包含“访问所有列”、“包括列”和“排除列”选项;“选择列”(下拉列表);“行筛选表达式”(多行文本框)。选择“排除列”选项,选择 customer_name 列进行排除,并且“行筛选表达式”字段包含 'product_type='pharma'。

请注意使用单引号将字符串 'pharma' 引起来。

您可以使用 Lake Formation 控制台创建此数据筛选条件,也可以向 CreateDataCellsFilter API 操作提供以下请求对象。

{ "Name": "restrict-pharma", "DatabaseName": "sales", "TableName": "orders", "TableCatalogId": "111122223333", "RowFilter": {"FilterExpression": "product_type='pharma'"}, "ColumnWildcard": { "ExcludedColumnNames": ["customer_name"] } }

您可以根据需要为表创建许多数据筛选条件。为此,您需要使用授权选项授予对表的 SELECT 权限。默认情况下,数据湖管理员有权在该账户中的所有表上创建数据筛选条件。在向主体授予对表的权限时,通常只使用一部分可能的数据筛选条件。例如,您可以为 orders 表创建第二个数据筛选条件,即 row-security-only 数据筛选条件。根据前面的屏幕截图,您可以选择访问所有列选项,并包括行筛选表达式 product_type<>pharma。此数据筛选条件的名称可能是 no-pharma。它限制对 product_type 列设置为“pharma”的所有行的访问。

此数据筛选条件的 CreateDataCellsFilter API 操作的请求对象如下。

{ "Name": "no-pharma", "DatabaseName": "sales", "TableName": "orders", "TableCatalogId": "111122223333", "RowFilter": {"FilterExpression": "product_type<>'pharma'"}, "ColumnNames": ["customer_id", "customer_name", "order_num" "product_id", "purchase_date", "product_type", "product_manufacturer", "quantity", "price"] }

然后,您可以使用 restrict-pharma 数据筛选条件向管理用户授予对 orders 表的 SELECT,并使用 no-pharma 数据筛选条件向非管理用户授予对 orders 表的 SELECT。对于医疗保健业的用户,您可以授予对 orders 表的 SELECT 以及对所有行和列的完整访问权限(没有数据筛选条件),或者还可以使用数据筛选条件来限制对定价信息的访问。

在数据筛选条件中指定列级别和行级别安全性时,可以包含或排除嵌套列。在以下示例中,使用限定列名称(用双引号括起来)指定对该 product.offer 字段的访问权限。这对于嵌套字段很重要,这样可以避免在列名称包含特殊字符时发生错误,并保持与顶级列级别安全性定义的向后兼容性。

{ "Name": "example_dcf", "DatabaseName": "example_db", "TableName": "example_table", "TableCatalogId": "111122223333", "RowFilter": { "FilterExpression": "customer.customerName <> 'John'" }, "ColumnNames": ["customer", "\"product\".\"offer\""] }