AWS Quicksight 在另一个区域看不到 Athena DB

AWS Quicksight cant see Athena DB in another region

我的 Athena 数据库位于 ap-south-1 区域,而 AWS QuickSight 在该区域不存在。

在这种情况下,如何将 QuickSightAthena 连接起来?

您需要做的就是将 table 定义从一个区域复制到另一个区域。有几种方法可以做到这一点

使用 AWS 控制台

这种方法是最简单的方法,不需要额外的设置,因为一切都基于 Athena DDL statements

  1. 获取 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')
    
  2. 更改到所需区域
  3. 在要存储 table 定义的位置创建 database,或使用默认定义。
  4. 执行 SHOW CREATE TABLE 生成的语句。请注意,您可能需要根据上一步更改数据库名称
  5. 如果您 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。这里有两个选择:

  1. 使用 Athena 客户端。与之前的方法一样,您需要从 AWS 控制台获取 table 定义语句。但是所有其他步骤都可以使用 Athena Client 的 start_query_execution 方法以脚本方式完成。网上有很多资源,例如this one

  2. 使用 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 上的数据,但我不推荐这种方法,因为您已经知道数据的结构。