将 AWS CLI 与 Hive 元存储结合使用 - Amazon Athena

将 AWS CLI 与 Hive 元存储结合使用

您可以使用 aws athena CLI 命令管理与 Athena 结合使用的 Hive 元数据仓数据目录。在定义一个或多个要与 Athena 结合使用的目录后,可以在 aws athena DDL 和 DML 命令中引用这些目录。

使用 AWS CLI 管理 Hive 元存储目录

注册目录:Create-data-catalog

要注册数据目录,请使用 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

要显示目录的详细信息,请将目录的名称传递到 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

要列出已注册的目录,请使用 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

要更新数据目录,请使用 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

要删除数据目录,请使用 delete-data-catalog 命令,如以下示例所示。

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

显示数据库详细信息:Get-database

要显示数据库的详细信息,请将目录名称和数据库名称传递到 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

要在目录中列出数据库,请使用 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

要显示表的元数据(包括列名和数据类型),请将目录名称、数据库名称和表名称传递到 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

要显示数据库中所有表的元数据,请将目录名称和数据库名称传递到 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 语句

在使用 AWS CLI 运行 DDL 和 DML 语句时,您可以通过两种方式之一传递 Hive 元存储目录的名称:

  • 直接传入支持它的语句。

  • 传递到 --query-execution-context Catalog 参数。

DDL 语句

以下示例将目录名称作为 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-contextCatalog 参数传递 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 语句

以下示例 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-contextCatalog 参数传入 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"