

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

# Lake Formation 中的数据筛选和单元格级别安全性
<a name="data-filtering"></a>

当您授予对数据目录表的 Lake Formation 权限时，可以包括数据筛选规范，以限制对查询结果中以及与 Lake Formation 集成的引擎中某些数据的访问。Lake Formation 使用数据筛选来实现列级别安全性、行级别安全性以及单元格级别安全性。如果源数据包含嵌套结构，则可以对嵌套列定义和应用数据筛选条件。

借助 Lake Formation 的数据筛选功能，您可以实现以下级别的数据安全性。

**列级别安全性**  
授予对具有列级别安全性（列筛选）的数据目录表的权限将仅允许用户查看表中他们有权访问的特定列和嵌套列。以一家大型多区域通信公司在多个应用程序中使用的 `persons` 表为例。通过列筛选来授予对数据目录表的权限可以限制非人力资源部门的用户查看社会保险号或出生日期等个人身份信息 (PII)。您还可以定义安全策略并仅授予对嵌套列的部分子结构的访问权限。

**行级别安全性**  
授予对具有行级别安全性（行筛选）的数据目录表的权限将仅允许用户查看表中他们有权访问的特定行。筛选基于一列或多列值。定义行筛选条件表达式时，可以包含嵌套列结构。例如，如果通信公司的不同地区办事处都有自己的人力资源部门，则可以限制人力资源部员工可以查看的人员记录，只允许他们查看他们所在区域的员工的记录。

**单元格级别安全性**  
单元格级别安全功能将行筛选和列筛选相结合，打造出了高度灵活的权限模型。如果您以网格形式查看表的行和列，则通过使用单元格级别安全功能，可以从两个方面限制从任意位置对网格中各个元素（单元格）的访问。也就是说，您可以根据行来限制对不同列的访问。下图阐明了这一点，其中受限制的列是带阴影的。

![显示的网格含有 5 行和 6 列。行和列具有 Col1、Col2、Row1、Row2 等标题。具有以下坐标的网格单元格带阴影：R3,C1；R3,C2；R3,C3；R5,C1；R5;C2；R5,C5；R5,C6。](http://docs.amazonaws.cn/lake-formation/latest/dg/images/cells-diagram.png)


继续来看 Persons 表示例，您可以在单元格级别创建*数据筛选条件*，如果行的国家/地区列设置为“英国”，则限制对街道地址列的访问，但如果行的国家/地区列设置为“美国”，则允许访问街道地址列。

筛选条件仅适用于读取操作。因此，您只能通过筛选条件授予 `SELECT` Lake Formation 权限。

**嵌套列的单元格级别安全性**  
Lake Formation 允许您对嵌套列定义和应用具有单元格级别安全性的数据筛选条件。但是，Amazon Athena、Amazon EMR 和 Amazon Redshift Spectrum 等集成分析引擎支持对具有行级别和列级别安全性的 Lake Formation 托管嵌套表执行查询。

有关限制，请参阅[数据筛选限制](data-filtering-notes.md)。

**Topics**
+ [Lake Formation 中的数据筛选条件](#data-filters-about)
+ [行筛选表达式支持 PartiQL](partiql-support.md)
+ [使用单元格级别筛选对表进行查询所需的权限](row-filtering-prereqs.md)
+ [管理数据筛选条件](managing-filters.md)

## Lake Formation 中的数据筛选条件
<a name="data-filters-about"></a>

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



每个数据筛选条件属于数据目录中的一个特定表。数据筛选条件包含以下信息。
+ 筛选条件名称
+ 与筛选器关联 IDs 的表的目录
+ 表名
+ 包含表的数据库的名称
+ 列规范 – 要在查询结果中包含或排除的列和嵌套列的列表（使用 `struct` 数据类型）。
+ 行筛选表达式 – 用于指定要包含在查询结果中的行的表达式。由于实施一些限制，该表达式的语法与 PartiQL 语言中 `WHERE` 子句的语法相同。要指定所有行，请选择控制台的**行级别访问**下的**访问所有行**，或者在 API 调用中使用 `AllRowsWildcard`。

  有关行筛选表达式支持哪些内容的更多信息，请参阅[行筛选表达式支持 PartiQL](partiql-support.md)。

您获得的筛选级别取决于填充数据筛选器的方式。
+ 如果指定“所有列”通配符并提供行筛选条件表达式，则仅建立行级安全性（行筛选）。
+ 如果包含或排除特定列和嵌套列并使用“所有行”通配符指定所有行，则仅会建立列级别安全性（列筛选）。
+ 如果包含或排除特定列，同时提供行筛选条件表达式，则建立单元格级别的安全性（单元格筛选）。

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

![数据筛选条件窗口包含以下垂直排列的字段：“数据筛选条件名称”；“目标数据库”；“目标表”；选项按钮组，其中包含“访问所有列”、“包括列”和“排除列”选项；“选择列”（下拉列表）；“行筛选表达式”（多行文本框）。已选择“排除列”选项，已选择 customer_name 列进行排除，并且“行筛选表达式”字段包含 'product_type='pharma'。](http://docs.amazonaws.cn/lake-formation/latest/dg/images/data-filter-sample-pharma.png)


请注意使用单引号将字符串 `'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\""]
}
```

**另请参阅**  
[管理数据筛选条件](managing-filters.md)