将 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-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 语句
以下示例 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"