

# 开始使用 AWS Glue Data Catalog
<a name="start-data-catalog"></a>

 AWS Glue Data Catalog 是您的持久性技术元数据存储。它是一项托管式服务，可用于存储、注释和共享 AWS 云中的元数据。有关更多信息，请参阅 [AWS Glue Data Catalog](https://docs.aws.amazon.com/glue/latest/dg/components-overview.html#data-catalog-intro)。


|  | 
| --- |
| AWS Glue 控制台和部分用户界面已于近期更新。 | 

## 概述
<a name="start-data-catalog-overview"></a>

 您可以使用本教程创建您的第一个 AWS Glue 数据目录，其使用 Amazon S3 存储桶作为您的数据源。

 在本教程中，您将使用 AWS Glue 控制台执行以下操作：

1.  创建一个数据库 

1.  创建表 

1.  使用 Amazon S3 桶作为数据来源 

 完成这些步骤后，您将成功使用 Amazon S3 存储桶作为数据源来填充 AWS Glue 数据目录。

## 步骤 1：创建数据库
<a name="start-data-catalog-database"></a>

 要开始使用，请登录 AWS 管理控制台，然后打开 [AWS Glue 控制台](https://console.aws.amazon.com/glue)。

 **要使用 AWS Glue 控制台创建数据库：**

1.  在 AWS Glue 控制台中，从左侧菜单中选择 **Data catalog**（数据目录）下的 **Databases**（数据库）。

1.  选择 **Add database**（添加数据库）。

1.  在“创建数据库”页面中，输入数据库的名称。在**位置 - *可选***部分中，设置 URI 位置以供 Data Catalog 的客户端使用。如果您不知道信息，则可以继续创建数据库。

1.  （可选）。输入数据库的描述。

1.  选择**创建数据库**。

 恭喜您，您刚刚使用 AWS Glue 控制台搭建了您的第一个数据库。您的新数据库将显示在可用数据库列表中。您可以在 **Databases**（数据库）控制面板中选择数据库名称，编辑数据库。

 **后续步骤** 

 ** Other ways to create a database: **（创建数据库的其他方法：） 

 您刚刚使用 AWS Glue 控制台创建了一个数据库，但还有其他方法也可以创建数据库：
+ 您可以使用爬网程序自动为自己创建数据库和表。要使用爬网程序设置数据库，请参阅 [在 AWS Glue 控制台中使用爬网程序](https://docs.aws.amazon.com/glue/latest/dg/console-crawlers.html)。
+  您可以使用 CloudFormation 模板。请参阅 [使用 AWS Glue Data Catalog 模板创建 AWS Glue 资源](https://docs.aws.amazon.com/glue/latest/dg/populate-with-cloudformation-templates.html)。
+  您还可以使用 AWS Glue 数据库 API 操作来创建数据库。

   要使用 `create` 操作来创建数据库，可通过添加 `DatabaseInput`（必需）参数来构建请求。

   例如：  
****  
 以下示例说明了如何使用 CLI、Boto3 或 DDL 根据您在教程中使用的 S3 存储桶中的相同 flights\$1data.csv 文件来定义表。  

  ```
  aws glue create-database --database-input "{\"Name\":\"clidb\"}"                                              
  ```

  ```
  glueClient = boto3.client('glue')
  
  response = glueClient.create_database(
      DatabaseInput={
          'Name': 'boto3db'
      }
  )
  ```

 有关数据库 API 数据类型、结构和操作的更多信息，请参阅 [数据库 API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-databases.html)。

 **后续步骤** 

 在下一个部分中，您将创建一个表并将该表添加到您的数据库中。

您还可以了解您数据目录的设置和权限。请参阅 [在 AWS Glue 控制台中使用数据目录设置](https://docs.aws.amazon.com/glue/latest/dg/console-data-catalog-settings.html)。

## 步骤 2：创建表
<a name="start-data-catalog-table"></a>

 在本步骤中，使用 AWS Glue 控制台创建表。

1.  在 AWS Glue 控制台中，从左侧菜单中选择 **Tables**（表）。

1.  选择 **Add table (添加表)**。

1.  通过在 **Table details**（表详细信息）中输入表的名称，设置表的属性。

1.  在 **Databases**（数据库）部分中，从下拉菜单选择您在步骤 1 中创建的数据库。

1.  在 **Add a data store**（添加数据存储）部分中，默认将选择 **S3** 作为源类型。

1.  对于 **Data is located in**（数据位置），选择 **Specified path in another account**（另一个账户中的指定路径）。

1. 复制并粘贴 **Include path**（包含路径）输入字段的路径：

   `s3://crawler-public-us-west-2/flight/2016/csv/`

1.  在 **Data format**（数据格式）部分中，对于 **Classification**（分类），选择 **CSV**，对于 **Delimiter**（分隔符），选择 **comma (,)** [逗号（,）]。选择**下一步**。

1. 系统会要求您定义架构。架构定义了数据记录的结构和格式。选择 **Add column**（添加列）。（有关更多信息，请参阅 [架构注册表](https://docs.aws.amazon.com/glue/latest/dg/schema-registry.html#schema-registry-schemas.html)）。

1.  指定列属性：

   1. 输入列名。

   1. 对于 **Column Type**（列类型），默认情况下已选中 string（字符串）。

   1. 对于 **Column number**（列编号），默认情况下已选中 1。

   1. 选择**添加**。

1.  系统会要求您添加分区索引。该项为可选项。要跳过此步，选择 **Next**（下一步）。

1.  此时将显示表属性的摘要。如果一切都符合预期，请选择**创建**。否则，请选择 **Back**（返回）并根据需要进行编辑。

 恭喜您，您已手动创建了一个表并成功将其关联到数据库。新创建的表将显示在 Tables（表）控制面板中。您可以在控制面板中修改和管理您的所有表。

 有关更多信息，请参阅 [在 AWS Glue 控制台中使用表](https://docs.aws.amazon.com/glue/latest/dg/console-tables.html)。

## 后续步骤
<a name="start-data-catalog-next-steps"></a>

 **后续步骤** 

 现已填充数据目录，您可以开始在 AWS Glue 中编写任务了。请参阅[使用 AWS Glue Studio 构建可视化 ETL 作业](https://docs.aws.amazon.com/glue/latest/dg/author-job-glue.html)。

 除了使用控制台之外，还有其他方法可以在数据目录中定义表，包括：
+  [创建和运行爬网程序](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html) 
+  [在 AWS Glue 中向爬网程序添加分类器](https://docs.aws.amazon.com/glue/latest/dg/add-classifier.html) 
+  [使用 AWS Glue 表 API](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html) 
+  [使用 AWS Glue Data Catalog 模板](https://docs.aws.amazon.com/glue/latest/dg/populate-with-cloudformation-templates.html) 
+  [迁移 Apache Hive 元存储](https://github.com/aws-samples/aws-glue-samples/tree/master/utilities/Hive_metastore_migration) 
+  [使用 AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/glue/create-table.html)、Boto3 或数据定义语言（DDL）   
****  
 以下示例说明了如何使用 CLI、Boto3 或 DDL 根据您在教程中使用的 S3 存储桶中的相同 flights\$1data.csv 文件来定义表。  
 请参阅有关如何构造 AWS CLI 命令的文档。CLI 示例包含“aws glue create-table --table-input”值的 JSON 语法。  

  ```
  {
          "Name": "flights_data_cli",
          "StorageDescriptor": {
              "Columns": [
                  {
                      "Name": "year",
                      "Type": "bigint"
                  },
                  {
                      "Name": "quarter",
                      "Type": "bigint"
                  }
              ],
              "Location": "s3://crawler-public-us-west-2/flight/2016/csv",
              "InputFormat": "org.apache.hadoop.mapred.TextInputFormat",
              "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
              "Compressed": false,
              "NumberOfBuckets": -1,
              "SerdeInfo": {
                  "SerializationLibrary": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe",
                  "Parameters": {
                      "field.delim": ",",
                      "serialization.format": ","
                  }
              }
          },
          "PartitionKeys": [
              {
                  "Name": "mon",
                  "Type": "string"
              }
          ],
          "TableType": "EXTERNAL_TABLE",
          "Parameters": {
              "EXTERNAL": "TRUE",
              "classification": "csv",
              "columnsOrdered": "true",
              "compressionType": "none",
              "delimiter": ",",
              "skip.header.line.count": "1",
              "typeOfData": "file"
          }
      }
  ```

  ```
  import boto3
  
  glue_client = boto3.client("glue")
  
  response = glue_client.create_table(
      DatabaseName='sampledb',
      TableInput={
          'Name': 'flights_data_manual',
      'StorageDescriptor': {
        'Columns': [{
          'Name': 'year',
          'Type': 'bigint'
        }, {
          'Name': 'quarter',
          'Type': 'bigint'
        }],
        'Location': 's3://crawler-public-us-west-2/flight/2016/csv',
        'InputFormat': 'org.apache.hadoop.mapred.TextInputFormat',
        'OutputFormat': 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat',
        'Compressed': False,
        'NumberOfBuckets': -1,
        'SerdeInfo': {
          'SerializationLibrary': 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe',
          'Parameters': {
            'field.delim': ',',
            'serialization.format': ','
          }
        },
      },
      'PartitionKeys': [{
        'Name': 'mon',
        'Type': 'string'
      }],
      'TableType': 'EXTERNAL_TABLE',
      'Parameters': {
        'EXTERNAL': 'TRUE',
        'classification': 'csv',
        'columnsOrdered': 'true',
        'compressionType': 'none',
        'delimiter': ',',
        'skip.header.line.count': '1',
        'typeOfData': 'file'
      }
      }
  )
  ```

  ```
  CREATE EXTERNAL TABLE `sampledb`.`flights_data` (
    `year` bigint, 
    `quarter` bigint)
  PARTITIONED BY ( 
    `mon` string)
  ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY ',' 
  STORED AS INPUTFORMAT 
    'org.apache.hadoop.mapred.TextInputFormat' 
  OUTPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
  LOCATION
    's3://crawler-public-us-west-2/flight/2016/csv/'
  TBLPROPERTIES (
    'classification'='csv', 
    'columnsOrdered'='true', 
    'compressionType'='none', 
    'delimiter'=',', 
    'skip.header.line.count'='1', 
    'typeOfData'='file')
  ```