AWS Quicksight 在另一个区域看不到 Athena DB
AWS Quicksight cant see Athena DB in another region
我的 Athena
数据库位于 ap-south-1 区域,而 AWS QuickSight
在该区域不存在。
在这种情况下,如何将 QuickSight
与 Athena
连接起来?
您需要做的就是将 table 定义从一个区域复制到另一个区域。有几种方法可以做到这一点
使用 AWS 控制台
这种方法是最简单的方法,不需要额外的设置,因为一切都基于 Athena DDL statements。
- 获取 table 定义
SHOW CREATE TABLE `database`.`table`;
这应该输出如下内容:
CREATE EXTERNAL TABLE `database`.`table`(
`col_1` string,
`col_2` bigint,
...
`col_n` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
's3://some/location/on/s3'
TBLPROPERTIES (
'classification'='parquet',
...
'compressionType'='gzip')
- 更改到所需区域
- 在要存储 table 定义的位置创建
database
,或使用默认定义。
- 执行
SHOW CREATE TABLE
生成的语句。请注意,您可能需要根据上一步更改数据库名称
如果您 table 已分区,则您需要加载所有分区。
如果 S3 上的数据遵循 HIVE 分区样式,即
s3://some/location/on/s3
|
├── day=01
| ├── hour=00
| └── hour=01
...
那么你可以使用
MSCK REPAIR TABLE `database`.`table`
或者,您可以一个一个地加载分区
ALTER TABLE `database`.`table`
ADD PARTITION (day='01', hour='00')
LOCATION 's3://some/location/on/s3/01/00';
ALTER TABLE `database`.`table`
ADD PARTITION (day='01', hour='01')
LOCATION 's3://some/location/on/s3/01/01';
...
使用 AWS API
您可以使用 AWS SDK,例如boto3
for python,它提供了一个易于使用、面向对象的 API。这里有两个选择:
使用 Athena 客户端。与之前的方法一样,您需要从 AWS 控制台获取 table 定义语句。但是所有其他步骤都可以使用 Athena Client 的 start_query_execution
方法以脚本方式完成。网上有很多资源,例如this one
使用 AWS Glue 客户端。此方法完全基于 AWS Glue 数据目录中的操作,Athena 在查询执行期间使用该目录。主要思想是创建两个粘合客户端,一个用于源,一个用于目标目录。例如
import boto3
KEY_ID = "__KEY_ID__"
SECRET = "__SECRET__"
glue_source = boto3.client(
'glue',
region_name="ap-south-1",
aws_access_key_id=KEY_ID,
aws_secret_access_key=SECRET
)
glue_destination = boto3.client(
'glue',
region_name="us-east-1",
aws_access_key_id=KEY_ID,
aws_secret_access_key=SECRET
)
# Or you can do it with creating sessions
glue_source = boto3.session.Session(profile_name="profile_for_ap_south_1").client("glue")
glue_destination = boto3.session.Session(profile_name="profile_for_us_east_1").client("glue")
然后你需要使用get和create类型方法。这还需要解析从粘合客户端获得的响应。
使用 AWS Glue 爬虫
尽管您可以使用 AWS Glue 爬虫来 "rediscover" S3 上的数据,但我不推荐这种方法,因为您已经知道数据的结构。
我的 Athena
数据库位于 ap-south-1 区域,而 AWS QuickSight
在该区域不存在。
在这种情况下,如何将 QuickSight
与 Athena
连接起来?
您需要做的就是将 table 定义从一个区域复制到另一个区域。有几种方法可以做到这一点
使用 AWS 控制台
这种方法是最简单的方法,不需要额外的设置,因为一切都基于 Athena DDL statements。
- 获取 table 定义
这应该输出如下内容:SHOW CREATE TABLE `database`.`table`;
CREATE EXTERNAL TABLE `database`.`table`( `col_1` string, `col_2` bigint, ... `col_n` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://some/location/on/s3' TBLPROPERTIES ( 'classification'='parquet', ... 'compressionType'='gzip')
- 更改到所需区域
- 在要存储 table 定义的位置创建
database
,或使用默认定义。 - 执行
SHOW CREATE TABLE
生成的语句。请注意,您可能需要根据上一步更改数据库名称 如果您 table 已分区,则您需要加载所有分区。 如果 S3 上的数据遵循 HIVE 分区样式,即
s3://some/location/on/s3 | ├── day=01 | ├── hour=00 | └── hour=01 ...
那么你可以使用
MSCK REPAIR TABLE `database`.`table`
或者,您可以一个一个地加载分区
ALTER TABLE `database`.`table` ADD PARTITION (day='01', hour='00') LOCATION 's3://some/location/on/s3/01/00'; ALTER TABLE `database`.`table` ADD PARTITION (day='01', hour='01') LOCATION 's3://some/location/on/s3/01/01'; ...
使用 AWS API
您可以使用 AWS SDK,例如boto3
for python,它提供了一个易于使用、面向对象的 API。这里有两个选择:
使用 Athena 客户端。与之前的方法一样,您需要从 AWS 控制台获取 table 定义语句。但是所有其他步骤都可以使用 Athena Client 的
start_query_execution
方法以脚本方式完成。网上有很多资源,例如this one使用 AWS Glue 客户端。此方法完全基于 AWS Glue 数据目录中的操作,Athena 在查询执行期间使用该目录。主要思想是创建两个粘合客户端,一个用于源,一个用于目标目录。例如
import boto3 KEY_ID = "__KEY_ID__" SECRET = "__SECRET__" glue_source = boto3.client( 'glue', region_name="ap-south-1", aws_access_key_id=KEY_ID, aws_secret_access_key=SECRET ) glue_destination = boto3.client( 'glue', region_name="us-east-1", aws_access_key_id=KEY_ID, aws_secret_access_key=SECRET ) # Or you can do it with creating sessions glue_source = boto3.session.Session(profile_name="profile_for_ap_south_1").client("glue") glue_destination = boto3.session.Session(profile_name="profile_for_us_east_1").client("glue")
然后你需要使用get和create类型方法。这还需要解析从粘合客户端获得的响应。
使用 AWS Glue 爬虫
尽管您可以使用 AWS Glue 爬虫来 "rediscover" S3 上的数据,但我不推荐这种方法,因为您已经知道数据的结构。