amazon-web-services - AWS Quicksight 在另一个区域看不到 Athena DB

标签 amazon-web-services amazon-athena amazon-quicksight

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

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

最佳答案

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

使用 AWS 控制台

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

  1. 获取表定义
    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. 在要存储表定义的位置创建数据库,或使用默认数据库。
  4. 执行 SHOW CREATE TABLE 生成的语句。请注意,您可能需要根据上一步更改数据库名称
  5. 如果您的表是分区的,那么您需要加载所有分区。 如果 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对于 python,它提供了一个易于使用的、面向对象的 API。这里有两个选择:

  1. 使用 Athena 客户端。与之前的方法一样,您需要从 AWS 控制台获取表定义语句。但是所有其他步骤都可以使用 Athena 客户端的 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 爬虫来“重新发现”S3 上的数据,但我不推荐这种方法,因为您已经知道数据的结构。

关于amazon-web-services - AWS Quicksight 在另一个区域看不到 Athena DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58318915/

相关文章:

node.js - Lambda Axios 发布到第二个 API 奇怪的异步行为

amazon-web-services - 如何在 AWS Athena 中定义 "date"列?

sql-injection - 如何解决 Athena 的 SQL 注入(inject)?

amazon-athena - 您可以在 Amazon Athena 中创建 View 吗?

amazon-web-services - AWS Quicksight : How to use parameter value inside SQL (data set) to render dynamic data on dashboard?

python - boto3 put_item 成功但没有出现记录

java - 我应该部署在 GAE 还是 AWS 上?

amazon-web-services - 有什么方法可以使用 AWS 服务压缩视频吗?

amazon-quicksight - AWS Quicksight - 如何按总和然后求平均值进行分组?

amazon-web-services - 将图像和文本字段添加到 Quicksight 仪表板