

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# AWS CLI 搭配 Hive 中繼存放區使用
<a name="datastores-hive-cli"></a>

您可以使用 `aws athena` CLI 命令來管理您搭配 Athena 使用的 Hive 中繼存放區資料目錄。定義一或多個搭配 Athena 使用的目錄之後，您可以在 `aws athena` DDL 和 DML 命令中參考這些目錄。

## 使用 AWS CLI 管理 Hive 中繼存放區目錄
<a name="datastores-hive-cli-manage-hive-catalogs"></a>

### 註冊目錄：Create-data-catalog
<a name="datastores-hive-cli-registering-a-catalog"></a>

若要註冊資料目錄，請使用 `create-data-catalog` 命令。使用 `name` 參數指定要用於目錄的名稱。將 Lambda 函數的 ARN 傳遞給 `parameters` 引數的 `metadata-function` 選項。若要為新目錄建立標籤，請將 `tags` 參數與一或多個以空格分隔的 `Key=key,Value=value` 引數組搭配使用。

以下為註冊名為 `hms-catalog-1` 的 Hive 中繼存放區的範例。為了方便閱讀，命令已經過格式化處理。

```
$ aws athena create-data-catalog 
 --name "hms-catalog-1" 
 --type "HIVE"
 --description "Hive Catalog 1"
 --parameters "metadata-function=arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-v3,sdk-version=1.0" 
 --tags Key=MyKey,Value=MyValue
 --region us-east-1
```

### 顯示目錄詳細資訊：Get-data-catalog
<a name="datastores-hive-cli-showing-details-of-a-catalog"></a>

若要顯示目錄的詳細資訊，請將目錄的名稱傳遞給 `get-data-catalog` 命令，如下列範例所示。

```
$ aws athena get-data-catalog --name "hms-catalog-1" --region us-east-1
```

以下樣本結果為 JSON 格式。

```
{
    "DataCatalog": {
        "Name": "hms-catalog-1",
        "Description": "Hive Catalog 1",
        "Type": "HIVE",
        "Parameters": {
            "metadata-function": "arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-v3",
            "sdk-version": "1.0"
        }
    }
}
```

### 列出已註冊的目錄：List-data-catalogs
<a name="datastores-hive-cli-listing-registered-catalogs"></a>

若要列示已註冊的目錄，請使用 `list-data-catalogs` 命令並選擇性地指定區域，如下列範例所示。列示的目錄永遠包括 AWS Glue在內。

```
$ aws athena list-data-catalogs --region us-east-1
```

以下樣本結果為 JSON 格式。

```
{
    "DataCatalogs": [
        {
            "CatalogName": "AwsDataCatalog",
            "Type": "GLUE"
        },
        {
            "CatalogName": "hms-catalog-1",
            "Type": "HIVE",
            "Parameters": {
                "metadata-function": "arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-v3",
                "sdk-version": "1.0"
            }
        }
    ]
}
```

### 更新目錄：Update-data-catalog
<a name="datastores-hive-cli-updating-a-catalog"></a>

若要更新資料目錄，請使用 `update-data-catalog` 命令，如下列範例所示。為了方便閱讀，命令已經過格式化處理。

```
$ aws athena update-data-catalog 
 --name "hms-catalog-1" 
 --type "HIVE"
 --description "My New Hive Catalog Description" 
 --parameters "metadata-function=arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new,sdk-version=1.0" 
 --region us-east-1
```

### 刪除目錄：Delete-data-catalog
<a name="datastores-hive-cli-deleting-a-catalog"></a>

若要刪除資料目錄，請使用 `delete-data-catalog` 命令，如下列範例所示。

```
$ aws athena delete-data-catalog --name "hms-catalog-1" --region us-east-1
```

### 顯示資料庫詳細資訊：Get-database
<a name="datastores-hive-cli-showing-details-of-a-database"></a>

若要顯示資料庫的詳細資訊，請將目錄和資料庫的名稱傳遞給 `get-database` 命令，如下列範例所示。

```
$ aws athena get-database --catalog-name hms-catalog-1 --database-name mydb
```

以下樣本結果為 JSON 格式。

```
{
    "Database": {
        "Name": "mydb",
        "Description": "My database",
        "Parameters": {
            "CreatedBy": "Athena",
            "EXTERNAL": "TRUE"
        }
    }
}
```

### 列出目錄中的資料庫：List-databases
<a name="datastores-hive-cli-listing-databases"></a>

若要列出目錄中的資料庫，請使用 `list-databases` 命令並選擇性地指定區域，如下列範例所示。

```
$ aws athena list-databases --catalog-name AwsDataCatalog --region us-west-2
```

以下樣本結果為 JSON 格式。

```
{
    "DatabaseList": [
        {
            "Name": "default"
        },
        {
            "Name": "mycrawlerdatabase"
        },
        {
            "Name": "mydatabase"
        },
        {
            "Name": "sampledb",
            "Description": "Sample database",
            "Parameters": {
                "CreatedBy": "Athena",
                "EXTERNAL": "TRUE"
            }
        },
        {
            "Name": "tpch100"
        }
    ]
}
```

### 顯示資料表詳細資訊：Get-table-metadata
<a name="datastores-hive-cli-showing-details-of-a-table"></a>

若要顯示資料表的中繼資料，包括資料行名稱和資料類型，請將目錄、資料庫的名稱和資料表名稱傳遞給 `get-table-metadata` 命令，如下列範例所示。

```
$ aws athena get-table-metadata --catalog-name AwsDataCatalog --database-name mydb --table-name cityuseragent
```

以下樣本結果為 JSON 格式。

```
{
    "TableMetadata": {
        "Name": "cityuseragent",
            "CreateTime": 1586451276.0,
            "LastAccessTime": 0.0,
            "TableType": "EXTERNAL_TABLE",
            "Columns": [
                {
                    "Name": "city",
                    "Type": "string"
                },
                {
                    "Name": "useragent1",
                    "Type": "string"
                }
            ],
            "PartitionKeys": [],
            "Parameters": {
                "COLUMN_STATS_ACCURATE": "false",
                "EXTERNAL": "TRUE",
                "inputformat": "org.apache.hadoop.mapred.TextInputFormat",
                "last_modified_by": "hadoop",
                "last_modified_time": "1586454879",
                "location": "s3://amzn-s3-demo-bucket/",
                "numFiles": "1",
                "numRows": "-1",
                "outputformat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
                "rawDataSize": "-1",
                "serde.param.serialization.format": "1",
                "serde.serialization.lib": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe",
                "totalSize": "61"
            }
        }
}
```

### 顯示資料庫中所有資料表的中繼資料：List-table-metadata
<a name="datastores-hive-cli-showing-all-table-metadata"></a>

若要顯示資料庫中所有資料表的中繼資料，請將目錄的名稱和資料庫名稱傳遞給 `list-table-metadata` 命令。`list-table-metadata` 命令與 `get-table-metadata` 命令類似，但是您不指定資料表名稱。若要限制結果的數目，您可以使用 `--max-results` 選項，如下列範例所示。

```
$ aws athena list-table-metadata --catalog-name AwsDataCatalog --database-name sampledb --region us-east-1 --max-results 2
```

以下樣本結果為 JSON 格式。

```
{
    "TableMetadataList": [
        {
            "Name": "cityuseragent",
            "CreateTime": 1586451276.0,
            "LastAccessTime": 0.0,
            "TableType": "EXTERNAL_TABLE",
            "Columns": [
                {
                    "Name": "city",
                    "Type": "string"
                },
                {
                    "Name": "useragent1",
                    "Type": "string"
                }
            ],
            "PartitionKeys": [],
            "Parameters": {
                "COLUMN_STATS_ACCURATE": "false",
                "EXTERNAL": "TRUE",
                "inputformat": "org.apache.hadoop.mapred.TextInputFormat",
                "last_modified_by": "hadoop",
                "last_modified_time": "1586454879",
                "location": "s3://amzn-s3-demo-bucket/",
                "numFiles": "1",
                "numRows": "-1",
                "outputformat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
                "rawDataSize": "-1",
                "serde.param.serialization.format": "1",
                "serde.serialization.lib": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe",
                "totalSize": "61"
            }
        },
        {
            "Name": "clearinghouse_data",
            "CreateTime": 1589255544.0,
            "LastAccessTime": 0.0,
            "TableType": "EXTERNAL_TABLE",
            "Columns": [
                {
                    "Name": "location",
                    "Type": "string"
                },
                {
                    "Name": "stock_count",
                    "Type": "int"
                },
                {
                    "Name": "quantity_shipped",
                    "Type": "int"
                }
            ],
            "PartitionKeys": [],
            "Parameters": {
                "EXTERNAL": "TRUE",
                "inputformat": "org.apache.hadoop.mapred.TextInputFormat",
                "location": "s3://amzn-s3-demo-bucket/",
                "outputformat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
                "serde.param.serialization.format": "1",
                "serde.serialization.lib": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe",
                "transient_lastDdlTime": "1589255544"
            }
        }
    ],
    "NextToken": "eyJsYXN0RXZhbHVhdGVkS2V5Ijp7IkhBU0hfS0VZIjp7InMiOiJ0Ljk0YWZjYjk1MjJjNTQ1YmU4Y2I5OWE5NTg0MjFjYTYzIn0sIlJBTkdFX0tFWSI6eyJzIjoiY2xlYXJpbmdob3VzZV9kYXRhIn19LCJleHBpcmF0aW9uIjp7InNlY29uZHMiOjE1ODkzNDIwMjIsIm5hbm9zIjo2NTUwMDAwMDB9fQ=="
}
```

## 執行 DDL 和 DML 陳述式
<a name="datastores-hive-cli-running-ddl-and-dml"></a>

當您使用 AWS CLI 執行 DDL 和 DML 陳述式時，您可以透過下列兩種方式之一傳遞 Hive 中繼存放區目錄的名稱：
+ 直接傳入支援它的陳述式。
+ 傳遞給 `--query-execution-context` `Catalog` 參數。

### DDL 陳述式
<a name="datastores-hive-cli-ddl-statements"></a>

下列範例會直接做為 `show create table` DDL 陳述式的一部分傳入目錄名稱。為了方便閱讀，命令已經過格式化處理。

```
$ aws athena start-query-execution 
 --query-string "show create table hms-catalog-1.hms_tpch_partitioned.lineitem" 
 --result-configuration "OutputLocation=s3://amzn-s3-demo-bucket/lambda/results"
```

下面的範例 DDL `show create table` 陳述式使用 `--query-execution-context` 的 `Catalog` 參數來傳遞 Hive 中繼存放區錄名稱 `hms-catalog-1`。為了方便閱讀，命令已經過格式化處理。

```
$ aws athena start-query-execution 
 --query-string "show create table lineitem" 
 --query-execution-context "Catalog=hms-catalog-1,Database=hms_tpch_partitioned" 
 --result-configuration "OutputLocation=s3://amzn-s3-demo-bucket/lambda/results"
```

### DML 陳述式
<a name="datastores-hive-cli-dml-statements"></a>

下列範例 DML `select` 陳述式將目錄名稱直接傳遞到查詢中。為了方便閱讀，命令已經過格式化處理。

```
$ aws athena start-query-execution
 --query-string "select * from hms-catalog-1.hms_tpch_partitioned.customer limit 100" 
 --result-configuration "OutputLocation=s3://amzn-s3-demo-bucket/lambda/results"
```

下列範例 DML `select` 陳述式使用 `--query-execution-context` 的 `Catalog` 參數傳入 Hive 中繼存放區目錄名稱 `hms-catalog-1`。為了方便閱讀，命令已經過格式化處理。

```
$ aws athena start-query-execution 
 --query-string "select * from customer limit 100" 
 --query-execution-context "Catalog=hms-catalog-1,Database=hms_tpch_partitioned" 
 --result-configuration "OutputLocation=s3://amzn-s3-demo-bucket/lambda/results"
```