

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

# 管理数据筛选条件
<a name="managing-filters"></a>

要实现列级、行级和单元格级安全性，您可以创建和维护数据筛选条件。每个数据筛选条件都属于一个数据目录表。您可以为一个表创建多个数据筛选条件，然后在授予对表的权限时使用其中的一个或多个筛选条件。您还可以对嵌套列定义和应用数据筛选条件，这些嵌套列具有 `struct` 数据类型，允许用户仅访问嵌套列的子结构。

您需要具有授予选项的 `SELECT` 权限才能创建或查看数据筛选条件。要允许您账户中的主体查看和使用某个数据筛选条件，您可以授予对该筛选条件的 `DESCRIBE` 权限。

**注意**  
Lake Formation 不支持授予对某个数据筛选条件的 `Describe` 权限，该筛选条件是从另一个账户共享的。

您可以使用 AWS Lake Formation 控制台、API 或 AWS Command Line Interface (AWS CLI) 来管理数据筛选器。

有关数据筛选条件的信息，请参阅 [Lake Formation 中的数据筛选条件](data-filtering.md#data-filters-about)。

# 创建数据筛选条件
<a name="creating-data-filters"></a>

您可以为每个数据目录表创建一个或多个数据筛选条件。

**为数据目录表创建数据筛选条件（控制台）**

1. 打开 Lake Formation 控制台，网址为[https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)。

   以数据湖管理员、目标表拥有者或对目标表具有 Lake Formation 权限的主体的身份进行登录。

1. 在导航窗格的**数据目录**下，选择**数据筛选条件**。

1. 在**数据筛选条件**页面上，选择**创建新筛选条件**。

1. 在**创建数据筛选条件**对话框中，输入以下信息：
   + 数据筛选条件名称 
   + 目标数据库 - 指定包含表的数据库。
   + 目标表 
   + 列级访问 - 将此设置保留为**访问所有列**以仅指定行筛选。选择**包括列**或**排除列**以指定列或单元格筛选，然后指定要包含或排除的列。

     嵌套列 - 如果要对包含嵌套列的表应用筛选条件，则可以在数据筛选条件中显式指定嵌套结构列的子结构。

     当您向某个主体授予对此筛选条件的 SELECT 权限时，执行以下查询的主体将只能看到 `customer.customerName` 的数据，而看不到 `customer.customerId` 的数据。

     ```
     SELECT "customer" FROM "example_db"."example_table";
     ```  
![\[Column-level access settings with options to include specific columns and filter rows.\]](http://docs.aws.amazon.com/zh_cn/lake-formation/latest/dg/images/nested-column-filter.png)

      当您授予对 `customer` 列的权限时，该主体将获得对该列和该列下的嵌套字段（`customerName` 和 `customerID`）的访问权限。
   + 行筛选表达式 – 输入筛选表达式以指定行或单元格筛选。有关支持的数据类型和运算符，请参阅[行筛选表达式支持 PartiQL](partiql-support.md)。选择**访问所有行**以授予对所有行的访问权限。

     您可以在行筛选条件表达式中包含嵌套列中的部分列结构，以筛选包含特定值的行。

     当主体被授予对带有行筛选条件表达式 `Select * from example_nestedtable where customer.customerName <>'John'` 的表的权限并且**列级别**访问权限设置为**访问所有列**时，查询结果仅会显示 `customerName <>'John'` 的计算结果为 true 的行。

   以下屏幕截图显示了实现单元格筛选的数据筛选条件。在针对 `orders` 表的查询中，它拒绝对 `customer_name` 列的访问，并且仅显示 `product_type` 列中包含“pharma”的行。  
![\[数据筛选条件窗口包含以下垂直排列的字段：“数据筛选条件名称”；“目标数据库”；“目标表”；选项按钮组，其中包含“访问所有列”、“包括列”和“排除列”选项；“选择列”（下拉列表）；“行筛选表达式”（多行文本框）。选择“排除列”选项，选择“customer_name”列进行排除，并且“行筛选表达式”字段包含“product_type='pharma”。\]](http://docs.aws.amazon.com/zh_cn/lake-formation/latest/dg/images/data-filter-sample-pharma.png)

1. 选择**创建筛选条件**。

**对嵌套字段使用单元格筛选条件策略创建数据筛选条件**

 本部分使用以下示例架构来演示如何创建数据单元格筛选条件：

```
[
    { name: "customer", type: "struct<customerId:string,customerName:string>" },
    { name: "customerApplication", type: "struct<appId:string>" },
    { name: "product", type: "struct<offer:struct<prodId:string,listingId:string>,type:string>" },
    { name: "purchaseId", type: "string" },
]
```

1. 在**创建数据筛选条件**页面上，输入数据筛选条件的名称。

1.  接下来，使用下拉列表选择数据库名称和表名称。

1. 在**列级别访问**部分中，选择包含的列，然后选择嵌套列 (`customer.customerName`)。

1. 在**行级别访问**部分中，选择**访问所有行**选项。

1. 选择**创建筛选条件**。

   当您授予对此筛选条件的 `SELECT` 权限时，主体可以访问 `customerName` 列中的所有行。

1. 接下来，为同一个数据库/表定义另一个数据筛选条件。

1. 在**列级别访问**部分中，选择包含的列，然后选择另一个嵌套列 (`customer.customerid`)。

1. 在**行级别访问**部分中，选择**筛选行**，然后输入**行筛选条件表达式** (`customer.customerid <> 5`)。

1. 选择**创建筛选条件**。

   当您授予对此筛选条件的 `SELECT` 权限时，主体将获得对 `customerName` 和 `customerId` 字段中所有行的访问权限，但 `customerId` 列中值为 5 的单元格除外。

# 授予数据筛选条件权限
<a name="granting-filter-perms"></a>

您可以向主体授予对数据筛选条件的 `SELECT`、`DESCRIBE` 和 `DROP` Lake Formation 权限。

首先，只有您可以查看为表创建的数据筛选条件。要使其他主体能够查看数据筛选条件并向数据筛选条件授予数据目录权限，您必须执行以下任一操作：
+ 使用授予选项向主体授予对表的 `SELECT` 权限，然后将数据筛选条件应用于授权。
+ 向主体授予对数据筛选条件的 `DESCRIBE` 或 `DROP` 权限。

您可以向外部 AWS 账户授予`SELECT`权限。然后，该账户中的数据湖管理员可以将该权限授予给该账户中的其他主体。向外部账户授予权限时，必须包括授予选项，以便外部账户的管理员可以进一步将权限级联到 his/her 账户中的其他用户。向账户中的主体授权时，可以使用授予选项进行授权。

您可以使用 AWS Lake Formation 控制台、API 或 AWS Command Line Interface (AWS CLI) 授予和撤消数据筛选器的权限。

------
#### [ Console ]

1. 登录 AWS 管理控制台 并打开 Lake Formation 控制台，网址为[https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)。

1. 在导航窗格的**权限**下，选择**数据湖权限**。

1. 在**权限**页面的**数据权限**部分中，选择**授予**。

1. 在**授予数据权限**页面上，选择要向其授予权限的主体。

1. 在“LF 标签或目录资源”部分下，选择**已命名数据目录资源**。然后选择要为其授予权限的数据库、表和数据筛选条件。  
![\[\]](http://docs.aws.amazon.com/zh_cn/lake-formation/latest/dg/images/grant-data-filter-perms-step2.png)

1. 在**数据筛选条件权限**部分中，选择要向所选主体授予的权限。  
![\[\]](http://docs.aws.amazon.com/zh_cn/lake-formation/latest/dg/images/grant-perms-on-filters.png)

------
#### [ AWS CLI ]
+ 输入 `grant-permissions` 命令。为 `resource` 参数指定 `DataCellsFilter`，并为 `Permissions` 参数和 `PermissionsWithGrantOption` 参数（可选）指定 `DESCRIBE` 或 `DROP`。

  以下示例在 AWS 账户 1111-2222-3333 中使用授予选项向用户 `datalake_user1` 授予对数据筛选条件 `restrict-pharma` 的 `DESCRIBE` 权限，该筛选条件属于 `sales` 数据库中的 `orders` 表。

  ```
  aws lakeformation grant-permissions --cli-input-json file://grant-params.json
  ```

  以下是 `grant-params.json` 文件的内容。

  ```
  {
      "Principal": {"DataLakePrincipalIdentifier": "arn:aws:iam::111122223333:user/datalake_user1"},
      "Resource": {
          "DataCellsFilter": {
              "TableCatalogId": "111122223333",
              "DatabaseName": "sales",
              "TableName": "orders",
              "Name": "restrict-pharma"
          }
      },
      "Permissions": ["DESCRIBE"],
      "PermissionsWithGrantOption": ["DESCRIBE"]
  }
  ```

------

# 授予数据筛选条件提供的数据权限
<a name="granting-data-perms-for-filters"></a>

数据筛选条件表示表中数据的子集。要向主体提供数据访问权限，需要向这些主体授予 `SELECT` 权限。有了这项权限，主体可以：
+ 在与其账户共享的表列表中查看实际的表名。
+ 针对共享表创建数据筛选条件，并向其用户授予对这些数据筛选条件的权限。

------
#### [ Console ]

**授予 SELECT 权限**

1. 前往 Lake Formation 控制台中的**权限**页面，然后选择**授予**。  
![\[\]](http://docs.aws.amazon.com/zh_cn/lake-formation/latest/dg/images/permissions-grant-action.png)

1. 选择您要向其提供访问权限的主体，然后选择**已命名数据目录资源**。  
![\[\]](http://docs.aws.amazon.com/zh_cn/lake-formation/latest/dg/images/grant-data-filter-perms-step2.png)

1. 要提供对筛选条件所代表数据的访问权限，请在**数据筛选条件权限**下选择 **Select**。  
![\[\]](http://docs.aws.amazon.com/zh_cn/lake-formation/latest/dg/images/grant-data-filter-perms-step3.png)

------
#### [ CLI ]

输入 `grant-permissions` 命令。为资源参数指定 `DataCellsFilter`，并为“权限”参数指定 `SELECT`。

以下示例在数据筛选器`datalake_user1`上向用户授予授权选项`restrict-pharma`，该筛选器属于中`sales`数据库中的`orders`表 AWS 账户 `1111-2222-3333`。`SELECT`

```
aws lakeformation grant-permissions --cli-input-json file://grant-params.json 
```

以下是 `grant-params.json` 文件的内容。

```
{
    "Principal": {
        "DataLakePrincipalIdentifier": "arn:aws:iam::111122223333:user/datalake_user1"
    },
    "Resource": {
        "DataCellsFilter": {
            "TableCatalogId": "111122223333", 
            "DatabaseName": "sales", 
            "TableName": "orders", 
            "Name": "restrict-pharma"
        }
    },
    "Permissions": ["SELECT"]
}
```

------

# 查看数据筛选条件
<a name="view-data-filters"></a>

你可以使用 Lake Formation 控制台或 Lake Formation API 来查看数据过滤器。 AWS CLI

要查看数据筛选条件，您必须是数据湖管理员或具有对数据筛选条件所需的权限。

------
#### [ Console ]

1. 登录 AWS 管理控制台 并打开 Lake Formation 控制台，网址为[https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)。

1. 在导航窗格的**数据目录**下，选择**数据筛选条件**。

   该页面显示了您可以访问数据筛选条件。  
![\[“数据筛选条件”页面显示了可用的数据筛选条件，其中包含以下各列：筛选条件名称、表、数据库和表目录 ID。屏幕截图显示了具有以下值的单个数据筛选条件：test-df、cloudtrailtest_cloudtrail、lakeformation_cloudtrail、修改后的账户 ID。表上方有四个按钮（从左到右）：刷新/重新加载、查看（灰显）、删除（灰显）和“创建新筛选条件”。还有一个搜索字段，该字段为空。\]](http://docs.aws.amazon.com/zh_cn/lake-formation/latest/dg/images/list-data-filters.jpg)

1. 要查看数据筛选条件的详细信息，请选择数据筛选条件，然后选择“查看”。此时将显示一个包含数据筛选条件详细信息的新窗口。  
![\[“查看数据筛选条件”窗口显示了有关所选数据筛选条件的其他信息。显示的信息包括名称、数据库、表、列级访问设置、行筛选表达式和列。\]](http://docs.aws.amazon.com/zh_cn/lake-formation/latest/dg/images/list-data-filters-details.jpg)

------
#### [ AWS CLI ]

输入 `list-data-cells-filter` 命令并指定表资源。

以下示例列出了 `cloudtrailtest_cloudtrail` 表的数据筛选条件。

```
aws lakeformation list-data-cells-filter --table '{ "CatalogId":"123456789012", 
"DatabaseName":"lakeformation_cloudtrail", "Name":"cloudtrailtest_cloudtrail"}'
```

------
#### [ API/SDK ]

使用 `ListDataCellsFilter` API 并指定表资源。

以下示例使用 Python 列出了 `myTable` 表的前 20 个数据筛选条件。

```
response = client.list_data_cells_filter(
    Table = {
        'CatalogId': '111122223333',
        'DatabaseName': 'mydb',
        'Name': 'myTable'
    },
    MaxResults=20
)
```

------

# 列出数据筛选条件权限
<a name="listing-filter-perms"></a>

您可以使用 Lake Formation 控制台查看对数据筛选条件授予的权限。

要查看对某个数据筛选条件的权限，您必须是 Data Lake 管理员或具有对该数据筛选条件所需的权限。

------
#### [ Console ]

1. 登录 AWS 管理控制台 并打开 Lake Formation 控制台，网址为[https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)。

1. 在导航窗格的**权限**下，选择**数据权限**。

1. 在**数据权限**页面上，单击或点按搜索字段，然后在**属性**菜单上选择**资源类型**。

1. 在**资源类型**菜单上，选择**资源类型：数据单元格筛选条件**。

   此时将列出您有权访问的数据筛选条件。您可能需要水平滚动才能看到**权限**和**可授予**列。  
![\[“数据权限”页面显示了一个权限表，其中包含以下列：“主体”、“资源类型”、“数据库”、“表”、“资源”、“目录”和“权限”。“资源类型”列在所有四行中均显示“数据单元格筛选条件”。第一行和第二行的权限均为 Describe、Drop 和 Select。第三行的权限为 Describe。表上方是一个“清除筛选条件”按钮和一个磁贴，该磁贴指示当前搜索是针对“资源类型：数据单元格筛选条件”。在此上面是搜索（文本）字段，然后上面是“刷新”、“撤销”和“授予”按钮。\]](http://docs.aws.amazon.com/zh_cn/lake-formation/latest/dg/images/data-permissions-cell-filters.png)

------
#### [ AWS CLI ]
+ 输入 `list-permissions` 命令。为 `resource` 参数指定 `DataCellsFilter`，并为 `Permissions` 参数和 `PermissionsWithGrantOption` 参数（可选）指定 `DESCRIBE` 或 `DROP`。

  以下示例列出了使用授予选项授予的对数据筛选条件 `restrict-pharma` 的 `DESCRIBE` 权限。结果仅限于为 AWS 账户 1111-2222-3333 中的委托`datalake_user1`人和`sales`数据库中的`orders`表授予的权限。

  ```
  aws lakeformation list-permissions --cli-input-json file://list-params.json
  ```

  以下是 `grant-params.json` 文件的内容。

  ```
  {
      "Principal": {"DataLakePrincipalIdentifier": "arn:aws:iam::111122223333:user/datalake_user1"},
      "Resource": {
          "DataCellsFilter": {
              "TableCatalogId": "111122223333",
              "DatabaseName": "sales",
              "TableName": "orders",
              "Name": "restrict-pharma"
          }
      },
      "Permissions": ["DESCRIBE"],
      "PermissionsWithGrantOption": ["DESCRIBE"]
  }
  ```

------