

# 管理 Data Catalog
<a name="manage-catalog"></a>

 AWS Glue Data Catalog 是一个中央元数据存储库，用于存储 Amazon S3 数据集的结构和操作元数据。高效管理 Data Catalog 对于维护数据质量、性能、安全性和治理至关重要。

 通过了解和应用这些 Data Catalog 管理实践，您可以确保随着数据环境的发展，您的元数据仍能保持准确、高性能、安全且治理良好。

本节介绍 Data Catalog 管理的以下方面：
+ *更新表架构和分区*随着数据的发展，您可能需要更新 Data Catalog 中定义的表架构或分区结构。有关如何使用 AWS Glue ETL 以编程方式进行这些更新的更多信息，请参阅[使用 AWS Glue ETL 任务在 Data Catalog 中更新架构并添加新分区](update-from-job.md)。
+ *管理列统计数据*：准确的列统计数据有助于优化查询计划并提高性能。有关如何生成、更新和管理列统计数据的更多信息，请参阅[使用列统计数据优化查询性能](column-statistics.md)。
+  *加密 Data Catalog* 要保护敏感元数据，可以使用 AWS Key Management Service（AWS KMS）加密 Data Catalog。本节介绍如何启用和管理 Data Catalog 的加密。
+ *使用 AWS Lake Formation 保护 Data Catalog* Lake Formation 提供了一种全面的数据湖安全和访问控制方法。您可以使用 Lake Formation 来保护和治理对 Data Catalog 和底层数据的访问。

**Topics**
+ [使用 AWS Glue ETL 任务在 Data Catalog 中更新架构并添加新分区](update-from-job.md)
+ [使用列统计数据优化查询性能](column-statistics.md)
+ [加密数据目录](catalog-encryption.md)
+ [使用 Lake Formation 保护您的 Data Catalog](secure-catalog.md)
+ [使用 AWS Glue 中的 AWS Glue Data Catalog 视图](catalog-views.md)

# 使用 AWS Glue ETL 任务在 Data Catalog 中更新架构并添加新分区
<a name="update-from-job"></a>

您的提取、转换和加载 (ETL) 作业可能会在目标数据存储中创建新的表分区。随着时间推移，您的数据集架构可能演变和偏离 AWS Glue 数据目录架构。AWS GlueETL 任务现在提供了几个功能，您可以在 ETL 脚本中使用这些功能在数据目录中更新架构和分区。这些功能允许您在数据目录中查看 ETL 工作的结果，而无需重新运行爬网程序。

## 新分区
<a name="update-from-job-partitions"></a>

如果要在 AWS Glue Data Catalog 中查看新分区，可以执行以下操作之一：
+ 在作业完成后，重新运行爬网程序，并在爬网程序完成后，在控制台上查看新分区。
+ 一旦作业完成，即可在控制台上查看新分区，而无需重新运行爬网程序。可以通过向 ETL 脚本添加几行代码来启用此功能，如以下示例中所示。代码使用 `enableUpdateCatalog` 参数指示数据目录在任务运行期间将随着新分区的创建而更新。

**方法 1：**  
在选项参数中传递 `enableUpdateCatalog` 和 `partitionKeys`。  

```
additionalOptions = {"enableUpdateCatalog": True}
additionalOptions["partitionKeys"] = ["region", "year", "month", "day"]


sink = glueContext.write_dynamic_frame_from_catalog(frame=last_transform, database=<target_db_name>,
                                                    table_name=<target_table_name>, transformation_ctx="write_sink",
                                                    additional_options=additionalOptions)
```

```
val options = JsonOptions(Map(
    "path" -> <S3_output_path>, 
    "partitionKeys" -> Seq("region", "year", "month", "day"), 
    "enableUpdateCatalog" -> true))
val sink = glueContext.getCatalogSink(
    database = <target_db_name>, 
    tableName = <target_table_name>, 
    additionalOptions = options)sink.writeDynamicFrame(df)
```

**方法 2：**  
在 `getSink()` 中传递 `enableUpdateCatalog` 和 `partitionKeys`，并对 `DataSink` 对象调用 `setCatalogInfo()`。  

```
sink = glueContext.getSink(
    connection_type="s3", 
    path="<S3_output_path>",
    enableUpdateCatalog=True,
    partitionKeys=["region", "year", "month", "day"])
sink.setFormat("json")
sink.setCatalogInfo(catalogDatabase=<target_db_name>, catalogTableName=<target_table_name>)
sink.writeFrame(last_transform)
```

```
val options = JsonOptions(
   Map("path" -> <S3_output_path>, 
       "partitionKeys" -> Seq("region", "year", "month", "day"), 
       "enableUpdateCatalog" -> true))
val sink = glueContext.getSink("s3", options).withFormat("json")
sink.setCatalogInfo(<target_db_name>, <target_table_name>)
sink.writeDynamicFrame(df)
```

现在，您可以使用 AWS Glue ETL 任务本身创建新的目录表、使用修改的架构更新现有表，并在数据目录中添加新的表分区，而无需重新运行爬网程序。

## 更新表架构
<a name="update-from-job-updating-table-schema"></a>

如果要覆盖数据目录表的架构，可以执行以下操作之一：
+ 作业完成后，重新运行爬网程序，并确保您的爬网程序也已配置为更新表定义。当爬网程序完成时，在查控制台上看新分区以及任何架构更新。有关更多信息，请参阅[使用 API 配置爬网程序](https://docs.aws.amazon.com/glue/latest/dg/crawler-configuration.html#crawler-configure-changes-api)。
+ 一旦作业完成，即可在控制台上查看修改的架构，而无需重新运行爬网程序。可以通过向 ETL 脚本添加几行代码来启用此功能，如以下示例中所示。代码将 `enableUpdateCatalog` 设置为 true，也将 `updateBehavior` 设置为 `UPDATE_IN_DATABASE`，这表示在任务运行期间将覆盖架构并在数据目录中添加新分区。

------
#### [ Python ]

```
additionalOptions = {
    "enableUpdateCatalog": True, 
    "updateBehavior": "UPDATE_IN_DATABASE"}
additionalOptions["partitionKeys"] = ["partition_key0", "partition_key1"]

sink = glueContext.write_dynamic_frame_from_catalog(frame=last_transform, database=<dst_db_name>,
    table_name=<dst_tbl_name>, transformation_ctx="write_sink",
    additional_options=additionalOptions)
job.commit()
```

------
#### [ Scala ]

```
val options = JsonOptions(Map(
    "path" -> outputPath, 
    "partitionKeys" -> Seq("partition_0", "partition_1"), 
    "enableUpdateCatalog" -> true))
val sink = glueContext.getCatalogSink(database = nameSpace, tableName = tableName, additionalOptions = options)
sink.writeDynamicFrame(df)
```

------

如果您希望防止表架构被覆盖，但仍希望添加新分区，也可以将该 `updateBehavior` 值设置为 `LOG`。`updateBehavior` 的默认值为 `UPDATE_IN_DATABASE`，因此，如果您没有明确定义它，则表架构将被覆盖。

如果 `enableUpdateCatalog` 未设置为 true，无论为 `updateBehavior` 选择哪个选项，ETL 任务都不会更新数据目录中的表。

## 创建新表
<a name="update-from-job-creating-new-tables"></a>

还可以使用相同的选项在数据目录中创建新表。您可以使用 `setCatalogInfo` 指定数据库和新表名。

------
#### [ Python ]

```
sink = glueContext.getSink(connection_type="s3", path="s3://path/to/data",
    enableUpdateCatalog=True, updateBehavior="UPDATE_IN_DATABASE",
    partitionKeys=["partition_key0", "partition_key1"])
sink.setFormat("<format>")
sink.setCatalogInfo(catalogDatabase=<dst_db_name>, catalogTableName=<dst_tbl_name>)
sink.writeFrame(last_transform)
```

------
#### [ Scala ]

```
val options = JsonOptions(Map(
    "path" -> outputPath, 
    "partitionKeys" -> Seq("<partition_1>", "<partition_2>"), 
    "enableUpdateCatalog" -> true, 
    "updateBehavior" -> "UPDATE_IN_DATABASE"))
val sink = glueContext.getSink(connectionType = "s3", connectionOptions = options).withFormat("<format>")
sink.setCatalogInfo(catalogDatabase = “<dst_db_name>”, catalogTableName = “<dst_tbl_name>”)
sink.writeDynamicFrame(df)
```

------

## 限制
<a name="update-from-job-restrictions"></a>

请注意以下限制：
+ 仅支持 Amazon Simple Storage Service（Amazon S3）目标。
+ 受管辖的表不支持 `enableUpdateCatalog` 功能。
+ 仅支持以下格式：`json`、`csv`、`avro` 和 `parquet`。
+ 要使用 `parquet` 分类创建或更新表，您必须使用 DynamicFrames 针对 AWS Glue 优化的 Parquet 写入器。这可以通过以下一种方法实现：
  + 如果您要使用 `parquet` 分类更新目录中的现有表，则必须先将表的 `"useGlueParquetWriter"` 表属性设置为 `true`，然后才能对其进行更新。您可以通过 AWS Glue API/SDK、控制台或 Athena DDL 语句设置此属性。  
![\[AWS Glue 控制台中的目录表属性编辑字段。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/edit-table-property.png)

    设置目录表属性后，您可以使用以下代码片段使用新数据更新目录表：

    ```
    glueContext.write_dynamic_frame.from_catalog(
        frame=frameToWrite,
        database="dbName",
        table_name="tableName",
        additional_options={
            "enableUpdateCatalog": True,
            "updateBehavior": "UPDATE_IN_DATABASE"
        }
    )
    ```
  + 如果目录中尚不存在该表，则可以在脚本中使用 `getSink()` 方法与 `connection_type="s3"` 将表及其分区添加到目录中，同时将数据写入 Amazon S3。为您的工作流程提供适当的 `partitionKeys` 和 `compression`。

    ```
    s3sink = glueContext.getSink(
        path="s3://bucket/folder/",
        connection_type="s3",
        updateBehavior="UPDATE_IN_DATABASE",
        partitionKeys=[],
        compression="snappy",
        enableUpdateCatalog=True
    )
        
    s3sink.setCatalogInfo(
        catalogDatabase="dbName", catalogTableName="tableName"
    )
        
    s3sink.setFormat("parquet", useGlueParquetWriter=True)
    s3sink.writeFrame(frameToWrite)
    ```
  + `glueparquet` 格式值是启用 AWS Glue Parquet 写入器的传统方法。
+ 当 `updateBehavior` 设置为 `LOG` 时，只有当 `DynamicFrame` 架构等效于或包含在数据目录表的架构中定义的列子集时，才会添加新分区。
+ 非分区表不支持架构更新（未使用“partitionKeys”选项）。
+ 在 ETL 脚本中传递的参数与数据目录表架构中的 partitionKey 之间，您的 partitionKeys 必须是等效的且顺序相同。
+ 此功能目前尚不支持更新/创建嵌套更新架构的表（例如，结构内的数组）。

有关更多信息，请参阅 [Spark 脚本编程](aws-glue-programming.md)。

# 在 ETL 作业中使用 MongoDB 连接
<a name="integrate-with-mongo-db"></a>

您可以为 MongoDB 创建连接，然后在 AWS Glue 任务中使用该连接。有关更多信息，请参阅 AWS Glue 编程指南中的 [MongoDB 连接](aws-glue-programming-etl-connect-mongodb-home.md)。连接 `url`、`username` 和 `password` 存储在 MongoDB 连接中。其他选项可以在 ETL 任务脚本中使用`additionalOptions` 参数 `glueContext.getCatalogSource` 指定。其他选项可包括：
+ `database`：（必需）要从中读取数据的 MongoDB 数据库。
+ `collection`：（必需）要从中读取数据的 MongoDB 集合。

通过将 `database` 和 `collection` 信息放在 ETL 任务脚本中，您可以在多个任务中使用相同的连接。

1. 为 MongoDB 数据源创建一个 AWS Glue Data Catalog 连接。请参阅[“connectionType”：“mongodb”](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-connect.html#aws-glue-programming-etl-connect-mongodb)以获取连接参数的说明。您可以使用控制台、API 或 CLI 创建此连接。

1. 在 AWS Glue Data Catalog 中创建数据库以存储 MongoDB 数据的表定义。请参阅[创建数据库](define-database.md)了解更多信息。

1. 创建一个爬网程序，使用连接到 MongoDB 的连接中的信息对 MongoDB 中的数据进行爬网。该爬网程序将在 AWS Glue Data Catalog 中创建表，这些表描述您在任务中使用的 MongoDB 数据库中的表。请参阅[使用爬网程序填充 Data Catalog](add-crawler.md)了解更多信息。

1. 使用自定义脚本创建任务。您可以使用控制台、API 或 CLI 创建此任务。有关更多信息，请参阅[在 AWS Glue 中添加任务](https://docs.aws.amazon.com/glue/latest/dg/add-job.html)。

1. 为任务选择数据目标。表示数据目标的表可以在数据目录中定义，或者您的任务可以在运行时创建目标表。在编写作业时，您会选择目标位置。如果目标需要连接，连接也会在您的作业中被引用。如果您的作业需要多个数据目标，您可以稍后通过编辑脚本来添加这些数据目标。

1. 通过为任务和生成的脚本提供参数，自定义任务处理环境。

   以下是一个基于数据目录中定义的表结构，从 MongoDB 数据库创建 `DynamicFrame` 的示例。该代码使用 `additionalOptions` 来提供其他数据源信息：

------
#### [  Scala  ]

   ```
   val resultFrame: DynamicFrame = glueContext.getCatalogSource(
           database = catalogDB, 
           tableName = catalogTable, 
           additionalOptions = JsonOptions(Map("database" -> DATABASE_NAME, 
                   "collection" -> COLLECTION_NAME))
         ).getDynamicFrame()
   ```

------
#### [  Python  ]

   ```
   glue_context.create_dynamic_frame_from_catalog(
           database = catalogDB,
           table_name = catalogTable,
           additional_options = {"database":"database_name", 
               "collection":"collection_name"})
   ```

------

1. 按需运行任务或通过触发器运行任务。

# 使用列统计数据优化查询性能
<a name="column-statistics"></a>

无需设置其他数据管道，即可为 Parquet、ORC、JSON、ION、CSV 和 XML 等数据格式的 AWS Glue Data Catalog 表计算列级别的统计数据。借助列统计数据，您可以深入洞察列中的值，从而了解数据特征。

Data Catalog 支持生成列值的统计数据，例如最小值、最大值、空值总数、不同值总数、值的平均长度以及 true 值的总出现次数。AWS 分析服务（例如 Amazon Redshift 和 Amazon Athena）可以使用这些列统计数据生成查询执行计划，并选择可提高查询性能的最佳计划。

生成列统计数据的场景有三种：

 **自动**   
AWS Glue 支持在目录级别自动生成列统计数据，以便它可以自动为 AWS Glue Data Catalog中的新表生成统计数据。

**已安排**  
AWS Glue 支持计划列统计数据生成，以便它可以按照定期计划自动运行。  
通过计划的统计数据计算，列统计数据任务会使用新的统计数据更新整体表级统计数据（例如最小值、最大值和平均值），从而为查询引擎提供准确、最新的统计数据来优化查询执行。

**按需**  
使用此选项可在需要时按需生成列统计数据。这对于临时分析或在需要立即计算统计数据时非常有用。

您可以配置为使用 AWS Glue 控制台、AWS CLI 或 AWS Glue API 操作来运行列统计数据生成任务。启动该进程时，AWS Glue 将在后台启动一个 Spark 作业并更新 Data Catalog 中的 AWS Glue 表元数据。您可以使用 AWS Glue 控制台、AWS CLI 或通过调用 [GetColumnStatisticsForTable](https://docs.aws.amazon.com/glue/latest/webapi/API_GetColumnStatisticsForTable.html) API 操作来查看列统计数据。

**注意**  
如果您使用 Lake Formation 权限来控制对表的访问权限，则列统计数据任务代入的角色需要拥有完全的表访问权限才能生成统计数据。

 以下视频说明了如何使用列统计信息来提高查询性能。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/zUHEXJdHUxs?si=HjyhpoALR6RXJz2i/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/zUHEXJdHUxs?si=HjyhpoALR6RXJz2i)


**Topics**
+ [生成列统计数据的先决条件](column-stats-prereqs.md)
+ [自动列统计数据生成](auto-column-stats-generation.md)
+ [按计划生成列统计数据](generate-column-stats.md)
+ [按需生成列统计数据](column-stats-on-demand.md)
+ [查看列统计数据](view-column-stats.md)
+ [查看列统计数据任务运行](view-stats-run.md)
+ [停止列统计数据任务运行](stop-stats-run.md)
+ [删除列统计数据](delete-column-stats.md)
+ [注意事项和限制](column-stats-notes.md)

# 生成列统计数据的先决条件
<a name="column-stats-prereqs"></a>

要生成或更新列统计数据，统计数据生成任务将代表您代入一个 AWS Identity and Access Management（IAM）角色。根据向该角色授予的权限，列统计数据生成任务可以读取 Amazon S3 数据存储中的数据。

配置列统计数据生成任务时，AWS Glue 允许您创建包含 `AWSGlueServiceRole` AWS 托管式策略以及指定数据源所需内联策略的角色。

如果您指定一个现有角色用于生成列统计数据，请确保它包含 `AWSGlueServiceRole` 策略或等效策略（或此策略的范围缩小版本），以及所需的内联策略。请按照下面的步骤创建新的 IAM 角色：

**注意**  
 要为由 Lake Formation 管理的表生成统计数据，用于生成统计数据的 IAM 角色需要具有完全的表访问权限。

配置列统计数据生成任务时，AWS Glue 允许您创建包含 `AWSGlueServiceRole` AWS 托管式策略以及指定数据源所需内联策略的角色。您也可以创建一个角色并附加以下策略中列出的权限，然后将该角色添加到列统计数据生成任务。

**创建 IAM 角色以生成列统计数据**

1. 要创建 IAM 角色，请参阅 [为 AWS Glue 创建 IAM 角色](https://docs.aws.amazon.com/glue/latest/dg/create-an-iam-role.html)。

1. 要更新现有的角色，进入 IAM 控制台后，请转到生成列统计数据进程正在使用的 IAM 角色。

1. 在**添加权限**选项卡中，选择**附加策略**。在新打开的浏览器窗口中，选择 `AWSGlueServiceRole` AWS 托管式策略。

1. 您还需要包含从 Amazon S3 数据位置读取数据所需的权限。

   在**添加权限**部分中，选择**创建策略**。在新打开的浏览器窗口中，创建将用于您的角色的新策略。

1. 在**创建策略**页面中，选择 **JSON** 选项卡。将以下 `JSON` 代码复制到策略编辑器字段中。
**注意**  
请将以下策略中的 account ID 替换为有效的 AWS 账户，将 `region` 替换为表所在的区域，并将 `bucket-name` 替换为 Amazon S3 存储桶的名称。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "S3BucketAccess",
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket",
                   "s3:GetObject"
               ],
               "Resource": [
               	"arn:aws:s3:::amzn-s3-demo-bucket/*",
   							"arn:aws:s3:::amzn-s3-demo-bucket"
               ]
           }
        ]
   }
   ```

------

1. （可选）如果您使用 Lake Formation 权限来提供对数据的访问权限，则该 IAM 角色需要具有 `lakeformation:GetDataAccess` 权限。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "LakeFormationDataAccess",
         "Effect": "Allow",
         "Action": "lakeformation:GetDataAccess",
         "Resource": [
           "*"
         ]
       }
     ]
   }
   ```

------

    如果该 Amazon S3 数据位置已注册到 Lake Formation，并且列统计数据生成任务所代入的 IAM 角色不具有对表的 `IAM_ALLOWED_PRINCIPALS` 组权限，则该角色需要具有对该表的 Lake Formation `ALTER` 和 `DESCRIBE` 权限。用于注册 Amazon S3 存储桶的角色需要具有对该表的 Lake Formation `INSERT` 和 `DELETE` 权限。

   如果该 Amazon S3 数据位置尚未注册到 Lake Formation，并且该 IAM 角色不具有对表的 `IAM_ALLOWED_PRINCIPALS` 组权限，则该角色需要具有对该表的 Lake Formation `ALTER`、`DESCRIBE`、`INSERT` 和 `DELETE` 权限。

1. 如果您已启用目录级别`Automatic statistics generation`选项，则 IAM 角色必须对默认 Data Catalog 具有 `glue:UpdateCatalog` 权限或 Lake Formation `ALTER CATALOG` 权限。您可以使用 `GetCatalog` 操作来验证目录属性。

1. （可选）对于写入加密 Amazon CloudWatch Logs 的列统计数据生成任务，密钥政策中需要包含以下权限。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "CWLogsKmsPermissions",
         "Effect": "Allow",
         "Action": [
           "logs:CreateLogGroup",
           "logs:CreateLogStream",
           "logs:PutLogEvents",
           "logs:AssociateKmsKey"
         ],
         "Resource": [
           "arn:aws:logs:us-east-1:111122223333:log-group:/aws-glue:*"
         ]
       },
       {
         "Sid": "KmsPermissions",
         "Effect": "Allow",
         "Action": [
           "kms:GenerateDataKey",
           "kms:Decrypt",
           "kms:Encrypt"
         ],
         "Resource": [
           "arn:aws:kms:us-east-1:111122223333:key/arn of key used for ETL cloudwatch encryption"
         ],
         "Condition": {
           "StringEquals": {
             "kms:ViaService": [
               "glue.us-east-1.amazonaws.com"
             ]
           }
         }
       }
     ]
   }
   ```

------

1. 用于运行列统计信息的角色必须拥有该角色的 `iam:PassRole` 权限。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "iam:PassRole"
         ],
         "Resource": [
           "arn:aws:iam::111122223333:role/columnstats-role-name"
         ]
       }
     ]
   }
   ```

------

1. 在您创建 IAM 角色以生成列统计数据时，该角色还必须具有以下的信任策略，以确保服务能够代入该角色。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "TrustPolicy",
         "Effect": "Allow",
         "Principal": {
           "Service": "glue.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

------

# 自动列统计数据生成
<a name="auto-column-stats-generation"></a>

自动生成列统计数据让您能够安排并自动计算 AWS Glue Data Catalog中新表的统计数据。启用自动统计数据生成后，Data Catalog 会发现具有特定数据格式（如 Parquet、JSON、CSV、XML、ORC、ION 和 Apache Iceberg）的新表及其各自的存储桶路径。通过一次性目录配置，Data Catalog 会为这些表生成统计数据。

 数据湖管理员可以通过在 Lake Formation 控制台中选择默认目录并使用`Optimization configuration`选项启用表统计数据来配置统计数据生成。当您在 Data Catalog 中创建新表或更新现有表时，Data Catalog 会每周收集 Apache Iceberg 表的不同值 (NDV) 数量以及其他统计数据（例如，其他受支持文件格式的空值数、最大值、最小值和平均长度）。

如果您已经在表级别配置了统计数据生成，或者您之前删除了表的统计数据生成设置，则这些特定于表的设置优先于自动列统计数据生成的默认目录设置。

 自动统计数据生成任务会分析表中 50% 的记录来计算统计数据。自动生成列统计数据可确保 Data Catalog 维护每周指标，Amazon Athena 和 Amazon Redshift Spectrum 等查询引擎可以使用这些统计数据来提高查询性能并可能节省成本。它允许使用 AWS Glue API 或控制台安排统计数据生成，从而提供无需人工干预的自动化流程。

**Topics**
+ [启用目录级别自动统计数据生成](enable-auto-column-stats-generation.md)
+ [查看自动表级设置](view-auto-column-stats-settings.md)
+ [禁用目录级别列统计数据生成](disable-auto-column-stats-generation.md)

# 启用目录级别自动统计数据生成
<a name="enable-auto-column-stats-generation"></a>

您可以为 Data Catalog 中所有新的 Apache Iceberg 表和非 OTF 表（Parquet、JSON、CSV、XML、ORC、ION）格式的表启用自动列统计数据生成。创建表后，您还可以手动显式更新列统计数据设置。

 要更新 Data Catalog 设置以启用目录级别，使用的 IAM 角色必须对根目录具有 `glue:UpdateCatalog` 权限或 AWS Lake Formation `ALTER CATALOG` 权限。您可以使用 `GetCatalog` API 来验证目录属性。

------
#### [ AWS 管理控制台 ]

**在账户级别启用自动列统计数据生成**

1. 通过 [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/) 打开 Lake Formation 控制台。

1. 在左侧导航栏上，选择**目录**。

1. 在**目录摘要**页面上，选择**优化配置**下的**编辑**。  
![\[此屏幕截图显示了可用于生成列统计数据的选项。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/edit-column-stats-auto.png)

1. 在**表优化配置**页面上，选择**启用自动为目录表生成统计数据**选项。  
![\[此屏幕截图显示了可用于生成列统计数据的选项。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/edit-optimization-option.jpg)

1. 选择一个现有 IAM 角色或创建一个具有运行列统计数据任务所需权限的新角色。

1. 选择**提交**。

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

您也可以通过 AWS CLI 启用目录级别统计数据收集。要使用 AWS CLI 配置表级统计数据收集，请运行下面的命令：

```
aws glue update-catalog --cli-input-json '{
    "name": "123456789012",
    "catalogInput": {
        "description": "Updating root catalog with role arn",
        "catalogProperties": {
            "customProperties": {
                "ColumnStatistics.RoleArn": "arn:aws:iam::"123456789012":role/service-role/AWSGlueServiceRole",
                "ColumnStatistics.Enabled": "true"
            }
        }
    }
}'
```

 上面的命令调用 AWS Glue 的 `UpdateCatalog` 操作，它采用具有以下键值对的 `CatalogProperties` 结构生成目录级别统计数据：
+ ColumnStatistics.RoleArn：用于为生成目录级别统计数据而触发的所有任务的 IAM 角色 ARN
+ ColumnStatistics.Enabled：表示目录级别设置是启用还是禁用的布尔值

------

# 查看自动表级设置
<a name="view-auto-column-stats-settings"></a>

 启用目录级别统计数据收集后，每当通过 AWS 管理控制台、SDK 或 AWS Glue 爬网程序利用 `CreateTable` 或 `UpdateTable` API 创建或更新 Apache Hive 表或 Apache Iceberg 表时，都会为该表创建等效的表级设置。

 启用了自动生成统计数据功能的表必须遵循以下属性之一：
+ 使用以 org.apache.hadoop 开头且 `TableType` 等于 `EXTERNAL_TABLE` 的 `InputSerdeLibrary`
+ 使用以 `com.amazon.ion` 开头且 `TableType` 等于 `EXTERNAL_TABLE` 的 `InputSerdeLibrary`
+ 在其参数结构中包含 table\$1type：“ICEBERG”。

 创建或更新表后，您可以验证表详细信息以确认统计数据生成。`Statistics generation summary`显示 `Schedule` 属性设置为 `AUTO`，而`Statistics configuration`值为`Inherited from catalog`。任何具有以下设置的表设置都将由 Glue 在内部自动触发。

![\[已应用带有目录级别统计数据收集的 Hive 表并且收集了统计数据的图像。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/auto-stats-summary.png)


# 禁用目录级别列统计数据生成
<a name="disable-auto-column-stats-generation"></a>

 您可以使用 AWS Lake Formation 控制台、`glue:UpdateCatalogSettings` API 或 `glue:DeleteColumnStatisticsTaskSettings` API 为新表禁用自动列统计数据生成。

**在账户级别禁用自动列统计数据生成**

1. 通过 [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/) 打开 Lake Formation 控制台。

1. 在左侧导航栏上，选择**目录**。

1. 在**目录摘要**页面上，选择**优化配置**下的**编辑**。

1. 在**表优化配置**页面上，取消选中**启用自动为目录表生成统计数据**选项。

1. 选择**提交**。

# 按计划生成列统计数据
<a name="generate-column-stats"></a>

请按照以下步骤，通过 AWS Glue 控制台、AWS CLI 或 [CreateColumnStatisticsTaskSettings](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-CreateColumnStatisticsTaskSettings) 操作在 AWS Glue Data Catalog 中配置统计数据生成计划。

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

**使用控制台生成列统计数据**

1. 通过以下网址登录到 AWS Glue 控制台：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。

1. 选择 Data Catalog 表。

1. 从列表中选择一个表。

1. 在**表**页的下半部分选择**列统计数据**选项卡。

1. 您也可以从**操作**部分的**列统计数据**下选择**按计划生成**。

1. 在**按计划生成统计数据**页面上选择频率和开始时间，从而配置运行列统计任务的定期计划。您可以选择每小时、每周、每周，也可以定义 cron 表达式来指定计划。

   cron 表达式是一个表示计划模式的字符串，由 6 个字段组成，用空格隔开：\$1 \$1 \$1 \$1 \$1 <minute> <hour> <day of month> <month> <day of week> <year> 例如，要在每天午夜运行任务，cron 表达式将是：0 0 \$1 \$1 ? \$1

   有关更多信息，请参阅 [Cron 表达式](https://docs.aws.amazon.com/glue/latest/dg/monitor-data-warehouse-schedule.html#CronExpressions)。  
![\[此屏幕截图显示了可用于生成列统计数据的选项。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/generate-column-stats-schedule.png)

1. 然后选择列选项来生成统计数据。
   + **所有列** – 选择此选项可生成表中所有列的统计信息。
   + **选定列** – 选择此选项可生成特定列的统计数据。您可以从下拉列表中选择列。

1. 选择一个 IAM 角色或创建一个具有统计数据生成权限的现有角色。AWS Glue 会代入该角色来生成列统计数据。

   一种更快的方法是让 AWS Glue 控制台为您创建一个角色。通过这种方法创建的角色专用于生成列统计数据，其中包含 `AWSGlueServiceRole` AWS 托管式策略以及指定数据来源所需的内联策略。

   如果您指定一个现有角色用于生成列统计数据，请确保它包含 `AWSGlueServiceRole` 策略或等效策略（或此策略的范围缩小版本），以及所需的内联策略。

1. （可选）然后选择一种安全配置来启用日志静态加密。

1. （可选）在指定样本容量时，您可以指定仅为表中特定百分比的行生成统计数据。默认值为所有行。使用向上和向下箭头可增加或减少百分比值。

   我们建议选择表中的所有行，以计算出准确的统计数据。仅在可接受近似值时，才使用样本行来生成列统计数据。

1. 选择**生成统计数据**，以运行列统计数据生成任务。

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

您可以使用以下 AWS CLI 示例来创建列统计数据生成计划。database-name、table-name 和 role 为必需参数，schedule、column-name-list、catalog-id、sample-size 和 security-configuration 为可选参数。

```
aws glue create-column-statistics-task-settings \ 
 --database-name 'database_name' \ 
 --table-name table_name \ 
 --role 'arn:aws:iam::123456789012:role/stats-role' \ 
 --schedule 'cron(0 0-5 14 * * ?)' \ 
 --column-name-list 'col-1' \  
 --catalog-id '123456789012' \ 
 --sample-size '10.0 ' \
 --security-configuration 'test-security'
```

您还可以通过调用 [StartColumnStatisticsTaskRun](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-StartColumnStatisticsTaskRun) 操作来生成列统计数据。

------

# 管理列统计数据生成计划
<a name="manage-column-stats-schedule"></a>

您可以管理 AWS Glue 中的列统计数据生成计划操作，例如更新、启动、停止和删除计划。您可以使用 AWS Glue 控制台、AWS CLI 或 [AWS Glue 列统计 API 操作](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html)来执行这些任务。

**Topics**
+ [更新列统计数据生成计划](#update-column-stats-shedule)
+ [停止列统计数据生成计划](#stop-column-stats-schedule)
+ [恢复列统计数据生成计划](#resume-column-stats-schedule)
+ [删除列统计数据生成计划](#delete-column-stats-schedule)

## 更新列统计数据生成计划
<a name="update-column-stats-shedule"></a>

创建列统计数据生成任务后，可以通过更新计划来触发该任务。您可以使用 AWS Glue 控制台、AWS CLI 或运行 [UpdateColumnStatisticsTaskSettings](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-UpdateColumnStatisticsTaskSettings) 操作来更新表的计划。您可以修改现有计划的参数，例如计划类型（按需或定期）和其他可选参数。

------
#### [ AWS 管理控制台 ]

**更新列统计数据生成任务的设置**

1. 通过以下网址登录到 AWS Glue 控制台：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。

1. 从表列表中选择要更新的表。

1. 在“表详细信息”页面的下半部分中，选择**列统计数据**选项卡。

1. 在**操作**下，选择**编辑**以更新计划。

1. 对计划进行所需的更改，然后选择**保存**。

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

 如果您并非通过控制台使用 AWS Glue 的统计数据生成功能，则可以使用 `update-column-statistics-task-settings` 命令手动更新计划。以下示例演示了如何使用 AWS CLI 更新列统计数据。

```
aws glue update-column-statistics-task-settings \ 
 --database-name 'database_name' \ 
 --table-name 'table_name' \ 
 --role arn:aws:iam::123456789012:role/stats_role \ 
 --schedule 'cron(0 0-5 16 * * ?)' \ 
 --column-name-list 'col-1' \
 --sample-size '20.0' \  
 --catalog-id '123456789012'\
 --security-configuration 'test-security'
```

------

## 停止列统计数据生成计划
<a name="stop-column-stats-schedule"></a>

 如果您不再需要增量统计数据，则可以停止生成计划以节省资源和成本。暂停计划不会影响之前生成的统计数据。您可以随时恢复计划。

------
#### [ AWS 管理控制台 ]

**停止列统计数据生成任何的计划**

1. 在 AWS Glue 控制台上，选择 Data Catalog 下的**表**。

1. 选择包含列统计数据的表。

1. 在**表详细信息**页面上，选择**列统计数据**。

1. 在**操作**下，依次选择**按计划生成**、**暂停**。

1. 选择**暂停**以进行确认。

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

要使用 AWS CLI 停止列统计任务运行计划，可以使用以下命令：

```
aws glue stop-column-statistics-task-run-schedule \
 --database-name ''database_name' \
 --table-name 'table_name'
```

请将 `database_name` 和 `table_name` 替换为要为其停止列统计任务运行计划的数据库和表的实际名称。

------

## 恢复列统计数据生成计划
<a name="resume-column-stats-schedule"></a>

 如果您之前暂停了统计数据生成计划，则 AWS Glue 允许您随时恢复该计划。您可以使用 AWS Glue 控制台、AWS CLI 或 [StartColumnStatisticsTaskRunSchedule](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-StartColumnStatisticsTaskRunSchedule) 操作恢复计划。

------
#### [ AWS 管理控制台 ]

**恢复列统计数据生成计划**

1. 在 AWS Glue 控制台上，选择 Data Catalog 下的**表**。

1. 选择包含列统计数据的表。

1. 在**表详细信息**页面上，选择**列统计数据**。

1. 在**操作**下，依次选择**按计划生成**、**恢复**。

1. 选择**恢复**以进行确认。

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

请将 `database_name` 和 `table_name` 替换为要为其停止列统计任务运行计划的数据库和表的实际名称。

```
aws glue start-column-statistics-task-run-schedule \
 --database-name 'database_name' \
 --table-name 'table_name'
```

------

## 删除列统计数据生成计划
<a name="delete-column-stats-schedule"></a>

 尽管为了获得最佳查询性能，通常建议保持统计数据为最新，但在某些特定的使用场景中，删除自动生成计划可能较有助益。
+ 如果数据保持相对静态，则现有的列统计数据可在很长一段时间内保持准确性，减少频繁更新的需求。删除计划可以防止不必要的资源消耗，以及与重新生成未更改数据的统计数据相关的开销。
+ 偏好手动控制统计数据生成时。通过删除自动计划，管理员可以有选择地按特定间隔时间或在数据发生重大更改后更新列统计数据，从而确保流程与其维护政策和资源分配需求保持一致。

------
#### [ AWS 管理控制台 ]

**删除列统计数据生成计划**

1. 在 AWS Glue 控制台上，选择 Data Catalog 下的**表**。

1. 选择包含列统计数据的表。

1. 在**表详细信息**页面上，选择**列统计数据**。

1. 在**操作**下，依次选择**按计划生成**、**删除**。

1. 选择**删除**以进行确认。

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

请将 `database_name` 和 `table_name` 替换为要为其停止列统计任务运行计划的数据库和表的实际名称。

您可以使用 [DeleteColumnStatisticsTaskSettings](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-DeleteColumnStatisticsTaskSettings) API 操作或 AWS CLI 来删除列统计数据生成计划。以下示例演示了如何使用 AWS Command Line Interface（AWS CLI）删除列统计数据生成计划。

```
aws glue delete-column-statistics-task-settings \
    --database-name 'database_name' \
    --table-name 'table_name'
```

------

# 按需生成列统计数据
<a name="column-stats-on-demand"></a>

您可以按需为 AWS Glue Data Catalog 表任务运行列统计任务，无需设定计划。此选项对于临时分析或需要立即计算统计数据的场景非常实用。

按照以下步骤，使用 AWS Glue 控制台或 AWS CLI 按需为 Data Catalog 表生成列统计数据。

------
#### [ AWS 管理控制台 ]

**使用控制台生成列统计数据**

1. 通过以下网址登录到 AWS Glue 控制台：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。

1. 选择 Data Catalog 表。

1.  从列表中选择一个表。

1. 在**操作**菜单下选择**生成统计数据**。

   您也可以选择**表**页面下半部分的**列统计数据**选项卡，然后选择**生成**、**按需生成**选项。

1. 按照[按计划生成列统计数据](generate-column-stats.md)中第 7-11 步的说明操作，生成表的列统计数据。

1. 在**生成统计数据**页面上，请指定以下选项：  
![\[此屏幕截图显示了可用于生成列统计数据的选项。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/generate-column-stats.png)
   + **所有列** – 选择此选项可生成表中所有列的统计信息。
   + **选定列** – 选择此选项可生成特定列的统计数据。您可以从下拉列表中选择列。
   + **IAM 角色**：选择**创建新 IAM 角色**，该角色应具有运行列统计数据生成任务所需的权限策略。选择“查看权限详细信息”，查看政策声明。您还可以从列表中选择 IAM 角色。有关所需权限的更多信息，请参阅 [生成列统计数据的先决条件](column-stats-prereqs.md)。

     AWS Glue 代入您指定的角色权限，生成统计信息。

     有关为 AWS Glue 提供角色的更多信息，请参阅 [Identity-based policies for AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/security_iam_service-with-iam.html#security_iam_service-with-iam-id-based-policies)。
   + （可选）然后选择一种安全配置来启用日志静态加密。
   + **样本行** – 仅从表中选择特定百分比的行来生成统计数据。默认值为所有行。使用向上和向下箭头可增加或减少百分比值。
**注意**  
我们建议选择表中的所有行，以计算出准确的统计数据。仅在可接受近似值时，才使用样本行来生成列统计数据。

   选择**生成统计数据**以运行任务。

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

该命令将触发指定表的列统计任务运行。您需要提供数据库名称、表名称、具有统计数据生成权限的 IAM 角色，此外还可以提供列名和以及统计数据计算的样本容量百分比。

```
aws glue start-column-statistics-task-run \ 
    --database-name 'database_name \ 
    --table-name 'table_name' \ 
    --role 'arn:aws:iam::123456789012:role/stats-role' \
    --column-name 'col1','col2'  \
    --sample-size 10.0
```

该命令将启动一项任务，从而为指定表生成列统计数据。

------

## 按需更新列统计数据
<a name="update-column-stats-on-demand"></a>

 确保列统计数据为最新，是查询优化器生成高效的执行计划、提高查询性能、减少资源消耗和提高整体系统性能的关键。这一过程在数据发生重大更改（例如批量加载或大量修改）之后尤为重要，因为这可能会使现有的统计数据过时。

您需要从 AWS Glue 控制台显式运行**生成统计数据**任务才能刷新列统计数据。Data Catalog 不会自动刷新统计数据。

如果您未使用控制台的使用 AWS Glue 统计数据生成功能，则可以使用 [UpdateColumnStatisticsForTable](https://docs.aws.amazon.com/glue/latest/webapi/API_UpdateColumnStatisticsForTable.html) API 操作或 AWS CLI 手动更新列统计数据。以下示例演示了如何使用 AWS CLI 更新列统计数据。

```
aws glue update-column-statistics-for-table --cli-input-json:

{
    "CatalogId": "111122223333",
    "DatabaseName": "database_name",
    "TableName": "table_name",
    "ColumnStatisticsList": [
        {
            "ColumnName": "col1",
            "ColumnType": "Boolean",
            "AnalyzedTime": "1970-01-01T00:00:00",
            "StatisticsData": {
                "Type": "BOOLEAN",
                "BooleanColumnStatisticsData": {
                    "NumberOfTrues": 5,
                    "NumberOfFalses": 5,
                    "NumberOfNulls": 0
                }
            }
        }
    ]
}
```

# 查看列统计数据
<a name="view-column-stats"></a>

成功生成统计数据后，Data Catalog 会存储这一信息，以便 Amazon Athena 和 Amazon Redshift 中基于成本的优化器在运行查询时做出最佳选择。统计数据因列的类型而异。

------
#### [ AWS 管理控制台 ]

**查看表的列统计数据**
+ 运行列统计数据任务后，**表详细信息**页面上的**列统计数据**选项卡将显示表的统计数据。  
![\[屏幕截图显示了最近一次运行生成的列。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/view-column-stats.png)

  将会提供以下统计数据：
  + 列名：用于生成统计数据的列名
  + 上次更新时间：生成统计数据的日期和时间
  + 平均长度：列中值的平均长度
  + 不重复值数：列中不重复的值总数。我们估算列中不重复的值的数量，相对误差为 5%。
  + 最大值：列中最大的值。
  + 最小值：列中最小的值。
  + 最大长度：列中最大值的长度。
  + 空值数：列中空值的总数。
  + True 值数：列中 True 值的总数。
  + False 值数：列中 False 值的总数。
  + numFiles：表中的文件总数。该值在**高级属性**选项卡下可用。

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

以下示例演示了如何使用 AWS CLI 检索列统计数据。

```
aws glue get-column-statistics-for-table \
    --database-name database_name \
    --table-name table_name \
    --column-names <column_name>
```

 您还可以使用 [GetColumnStatisticsForTable](https://docs.aws.amazon.com/glue/latest/webapi/API_GetColumnStatisticsForTable.html) API 操作来查看列统计数据。

------

# 查看列统计数据任务运行
<a name="view-stats-run"></a>

运行列统计任务后，您可以使用 AWS Glue 控制台、AWS CLI 或 [GetColumnStatisticsTaskRuns](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-GetColumnStatisticsTaskRun) 操作来浏览表的任务运行详细信息。

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

**查看列统计数据任务运行的详细信息**

1. 在 AWS Glue 控制台上，选择 Data Catalog 下的**表**。

1. 选择包含列统计数据的表。

1. 在**表详细信息**页面上，选择**列统计数据**。

1. 选择**查看运行**。

   您可以看到与指定表关联的所有运行的信息。  
![\[此屏幕截图显示了可用于生成列统计数据的选项。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/view-column-stats-task-runs.png)

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

在以下示例中，请将 `DatabaseName` 和 `TableName` 的值替换为实际的数据库名和表名。

```
aws glue get-column-statistics-task-runs --input-cli-json file://input.json
{
    "DatabaseName": "database_name",
    "TableName": "table_name"
}
```

------

# 停止列统计数据任务运行
<a name="stop-stats-run"></a>

您可以使用 AWS Glue 控制台、AWS CLI 或 [StopColumnStatisticsTaskRun](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-column-statistics.html#aws-glue-api-crawler-column-statistics-StopColumnStatisticsTaskRun) 操作来停止某个表的列统计任务运行。

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

**停止列统计数据任务运行**

1. 在 AWS Glue 控制台上，选择 Data Catalog 下的**表**。

1. 选择正在进行列统计数据任务运行的表。

1. 在**表详细信息**页面上，选择**列统计数据**。

1. 选择**停止**。

   如果您在运行完成之前停止该任务，则不会生成该表的列统计数据。

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

在以下示例中，请将 `DatabaseName` 和 `TableName` 的值替换为实际的数据库名和表名。

```
aws glue stop-column-statistics-task-run --input-cli-json file://input.json
{
    "DatabaseName": "database_name",
    "TableName": "table_name"
}
```

------

# 删除列统计数据
<a name="delete-column-stats"></a>

您可以使用 [DeleteColumnStatisticsForTable](https://docs.aws.amazon.com/glue/latest/webapi/API_DeleteColumnStatisticsForTable.html) API 操作或 AWS CLI 来删除列统计数据。以下示例演示了如何使用 AWS Command Line Interface（AWS CLI）删除列统计数据。

```
aws glue delete-column-statistics-for-table \
    --database-name 'database_name' \
    --table-name 'table_name' \
    --column-name 'column_name'
```

# 注意事项和限制
<a name="column-stats-notes"></a>

生成列统计数据时应注意以下因素和限制。

**注意事项**
+ 使用采样方法生成统计数据可以减少运行时间，但生成的统计数据可能不准确。
+ Data Catalog 不会存储不同版本的统计数据。
+ 每个表一次只能运行一个统计数据生成任务。
+ 如果使用注册到 Data Catalog 的客户 AWS KMS 密钥对表进行加密，则 AWS Glue 将使用相同的密钥来加密统计数据。

**在满足下列条件中的一个时，列统计数据任务才能生成统计数据：**
+ 该 IAM 角色拥有完整的表权限（IAM 或 Lake Formation）。
+ 该 IAM 角色使用 Lake Formation 混合访问模式取得了对表的权限。

**对于下列情况，列统计数据任务不支持生成统计数据：**
+ 启用了 Lake Formation 基于单元格的访问控制的表
+ 事务处理数据湖 – Linux 基金会 Delta Lake、Apache Hudi
+ 联合身份验证数据库中的表 – Hive 元数据存储、Amazon Redshift 数据共享
+ 嵌套列、数组和结构数据类型。
+ 其他账户共享给您的表

# 加密数据目录
<a name="catalog-encryption"></a>

 您可以使用由 AWS Key Management Service（AWS KMS）管理的加密密钥保护存储在 AWS Glue Data Catalog 中的静态元数据。您可以使用 **Data Catalog 设置**为新的 Data Catalog 启用 Data Catalog 加密。您可以根据需要启用或禁用现有 Data Catalog 的加密。启用后，AWS Glue 会加密写入目录的所有新元数据，而现有元数据将保持未加密状态。

有关加密 Data Catalog 的详细信息，请参阅[加密数据目录](encrypt-glue-data-catalog.md)。

# 使用 Lake Formation 保护您的 Data Catalog
<a name="secure-catalog"></a>

 AWS Lake Formation 是一项服务，让用户能够在 AWS 中更轻松地设置安全数据湖。它通过定义精细的访问控制权限，为创建和安全管理数据湖提供了一个中央位置。Lake Formation 使用 Data Catalog 来存储和检索有关数据湖的元数据，例如表定义、架构信息和数据访问控制设置。

您可以向 Lake Formation 注册元数据表或数据库的 Amazon S3 数据位置，并使用它来定义 Data Catalog 资源的元数据级别权限。您还可以使用 Lake Formation 代表集成分析引擎管理 Amazon S3 上存储的底层数据的存储访问权限。

有关更多信息，请参阅 [What is AWS Lake Formation?](lake-formation/latest/dg/what-is-lake-formation.html)。

# 使用 AWS Glue 中的 AWS Glue Data Catalog 视图
<a name="catalog-views"></a>

 您可以在 AWS Glue Data Catalog 中创建和管理视图，通常称为 AWS Glue Data Catalog 视图。这些视图非常有用，因为它们支持多个 SQL 查询引擎，也支持跨不同 AWS 服务（例如 Amazon Athena、Amazon Redshift 和 AWS Glue）访问同一视图。您可以使用基于 Apache Iceberg、Apache Hudi 和 Delta Lake 的视图。

 通过在 Data Catalog 中创建视图，您可以在 AWS Lake Formation 中使用资源授予和基于标记的访问控制，来授予对视图的访问权限。使用这种访问控制方法，您无需为创建视图时引用的表配置其他访问权限。这种授予权限的方法称为定义者语义，这些视图称为定义者视图。有关 AWS Lake Formation 中访问控制的更多信息，请参阅《AWS Lake Formation Developer Guide》中的 [Granting and revoking permissions on Data Catalog resources](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-catalog-permissions.html)。

 数据目录视图对于以下用例非常实用：
+  **精细访问控制**：您可以创建一个视图，根据用户所需的权限来限制数据访问。例如，您可以使用 Data Catalog 中的视图来防止不在 HR 部门工作的员工查看个人身份信息（PII）。
+  **完整视图定义**：通过对 Data Catalog 中的视图应用某些筛选条件，可确保视图内可用的数据记录始终完整。
+  **增强的安全性**：用于创建视图的查询定义必须完整，使 Data Catalog 视图不易受到恶意行为者的 SQL 命令的影响。
+  **简单数据共享**：使用 AWS Lake Formation 中的跨账户数据共享功能，无需移动数据即可与其他 AWS 账户共享数据。

## 创建 Data Catalog 视图
<a name="catalog-creating-view"></a>

 您可以利用 AWS CLI 和使用 Spark SQL 的 AWS Glue ETL 脚本创建 Data Catalog 视图。创建 Data Catalog 视图的语法包括将视图类型指定为 `MULTI DIALECT`，将 `SECURITY` 谓词指定为 `DEFINER`，表示定义者视图。

 创建 Data Catalog 视图的 SQL 语句示例：

```
CREATE PROTECTED MULTI DIALECT VIEW database_name.catalog_view SECURITY DEFINER
AS SELECT order_date, sum(totalprice) AS price
FROM source_table
GROUP BY order_date;
```

 创建 Data Catalog 视图后，您可以使用对该视图拥有 AWS Lake Formation“SELECT”权限的 IAM 角色，从 Amazon Athena、Amazon Redshift 或 AWS Glue ETL 作业等服务查询该视图。您无需授予对视图中引用的基础表的访问权限。

 有关创建和配置 Data Catalog 视图的更多信息，请参阅《AWS Lake Formation Developer Guide》中的 [Building AWS Glue Data Catalog views](https://docs.aws.amazon.com/lake-formation/latest/dg/working-with-views.html)。

## 支持的视图操作
<a name="catalog-supported-view-operations"></a>

 以下命令片段展示了使用 Data Catalog 视图的各种方法：

 **CREATE VIEW** 

 创建数据目录视图。以下示例演示如何根据现有表格创建视图：

```
CREATE PROTECTED MULTI DIALECT VIEW catalog_view 
SECURITY DEFINER AS SELECT * FROM my_catalog.my_database.source_table
```

 **ALTER VIEW** 

 可用语法：

```
ALTER VIEW view_name [FORCE] ADD DIALECT AS query
ALTER VIEW view_name [FORCE] UPDATE DIALECT AS query
ALTER VIEW view_name DROP DIALECT
```

 您可以使用 `FORCE ADD DIALECT` 选项，根据新的引擎方言强制更新架构和子对象。请注意，如果不同时使用 `FORCE` 更新其他引擎方言，这样做可能会导致查询错误。示例如下：

```
ALTER VIEW catalog_view FORCE ADD DIALECTAS
SELECT order_date, sum(totalprice) AS priceFROM source_tableGROUP BY orderdate;
```

 下例显示了如何更改视图来更新方言：

```
ALTER VIEW catalog_view UPDATE DIALECT AS
SELECT count(*) FROM my_catalog.my_database.source_table;
```

 **DESCRIBE VIEW** 

 描述视图的可用语法：

 `SHOW COLUMNS {FROM|IN} view_name [{FROM|IN} database_name]`：如果用户具有描述视图所需的 AWS Glue 和 AWS Lake Formation 权限，则可列出相应列。下面显示了几个用于显示列的示例命令：

```
SHOW COLUMNS FROM my_database.source_table;    
SHOW COLUMNS IN my_database.source_table;
```

 `DESCRIBE view_name`：如果用户具有描述视图所需的 AWS Glue 和 AWS Lake Formation 权限，则可列出视图中的相应列及其元数据。

 **DROP VIEW** 

 可用语法：

```
DROP VIEW [ IF EXISTS ] view_name
```

 以下示例显示了 `DROP` 语句，该语句用于在删除视图之前测试视图是否存在：

```
DROP VIEW IF EXISTS catalog_view;
```

 `SHOW CREATE VIEW view_name`：显示创建指定视图的 SQL 语句。以下示例演示如何创建数据目录视图：

```
SHOW CREATE TABLE my_database.catalog_view;CREATE PROTECTED MULTI DIALECT VIEW my_catalog.my_database.catalog_view (
  net_profit,
  customer_id,
  item_id,
  sold_date)
TBLPROPERTIES (
  'transient_lastDdlTime' = '1736267222')
SECURITY DEFINER AS SELECT * FROM
my_database.store_sales_partitioned_lf WHERE customer_id IN (SELECT customer_id from source_table limit 10)
```

 **SHOW VIEWS** 

 列出目录中的所有视图，例如常规视图、多方言视图（MDV）和没有 Spark 方言的 MDV。可用语法如下：

```
SHOW VIEWS [{ FROM | IN } database_name] [LIKE regex_pattern]:
```

 下面显示了用于显示视图的示例命令：

```
SHOW VIEWS IN marketing_analytics LIKE 'catalog_view*';
```

 有关创建和配置 Data Catalog 视图的更多信息，请参阅《AWS Lake Formation Developer Guide》中的 [Building AWS Glue Data Catalog views ](https://docs.aws.amazon.com/lake-formation/latest/dg/working-with-views.html)。

## 查询 Data Catalog 视图
<a name="catalog-view-query"></a>

 创建 Data Catalog 视图后，即可查询视图。在 AWS Glue 作业中配置的 IAM 角色，必须拥有对 Data Catalog 视图的 Lake Formation **SELECT** 权限。您无需授予对视图中引用的基础表的访问权限。

 完成所有设置后，就可以查询视图。例如运行以下查询来访问视图。

```
SELECT * from my_database.catalog_view LIMIT 10;
```

## 限制
<a name="catalog-view-limitations"></a>

 使用数据目录视图时，请考虑以下限制。
+  只能使用 AWS Glue 5.0 及更高版本来创建 Data Catalog 视图。
+  Data Catalog 视图定义者必须拥有对视图访问的基础基表的 `SELECT` 访问权限。如果特定基表对定义者角色施加了任何 Lake Formation 筛选条件，则创建 Data Catalog 视图将失败。
+  在 AWS Lake Formation 中，基表不得具有 `IAMAllowedPrincipals` 数据湖权限。如果有，则会出现错误“**多方言视图只能引用没有 IAMAllowedPrincipals 权限的表**”。
+  该表的 Amazon S3 位置必须注册为 AWS Lake Formation 数据湖位置。如果表未注册，则会出现错误：`Multi Dialect views may only reference AWS Lake Formation managed tables`。有关如何在 AWS Lake Formation 中注册 Amazon S3 位置的信息，请参阅《AWS Lake Formation Developer Guide》中的 [ Registering an Amazon S3 location](https://docs.aws.amazon.com/lake-formation/latest/dg/register-data-lake.html)。
+  只能创建 `PROTECTED` 数据目录视图。不支持 `UNPROTECTED` 视图。
+  在 Data Catalog 视图定义中，既不能引用其他 AWS 账户中的表，也不能引用不同区域中同一账户中的表。
+  要跨账户或区域共享数据，必须使用 AWS Lake Formation 资源链接跨账户和跨区域共享整个视图。
+  不支持用户定义的函数（UDF）。
+  不能在数据目录视图中引用其他视图。