AWS Quicksight实践:从零到可视化分析

一、什么是 QuickSight?

Amazon QuickSight 是 AWS 提供的一款 云原生商业智能(BI)工具,它能让用户直接在云端快速构建交互式仪表盘、报表和可视化分析,而无需传统 BI 工具繁琐的运维部署。

它的定位是 轻量、快、自动扩展、与 AWS 服务紧密集成。你可以直接连接 Athena、Redshift、RDS、S3 里的数据,还可以直接上传json文件入库,能快速做出图表并分享给团队和个人。

二、QuickSight 的核心特点

  1. 无服务器化:不用自己搭 BI 平台,QuickSight 托管在 AWS。

  2. 数据源丰富:支持直接连接 S3、Athena、RDS、Redshift、Snowflake、Salesforce、Excel、CSV 等。

  3. 交互式仪表盘:不仅能画柱状图、折线图、饼图,还支持 Sankey 图、词云、热力图等高级可视化。

  4. SPICE 引擎:QuickSight 内置了一个高性能内存计算引擎(SPICE),数据加载进去之后查询速度很快,适合大规模交互分析。

  5. 与 AWS 集成:IAM 控制权限,CloudTrail 记录操作日志,CloudWatch 监控,Lambda 触发刷新任务,原生生态优势明显。

三、数据准备与建模

在 QuickSight 里,数据的使用大体分三步:

  1. 数据集(Dataset):

    创建方式如图所示,支持很多方式。数据导入选择SPICE,会大幅度提升页面加载速度。

  2. 字段计算

    • QuickSight 支持类似 Excel 的计算字段语法,例如:

      复制代码
      ifelse({status} = 'FAILED', 1, 0)
  3. 数据刷新

    • 导入 SPICE 后可定时刷新

    • 也可以用 boto3 的 create_ingestion API 实现立即刷新

四、可视化实践

1. 本地自动上传文件为例:

(1)创建dataset,并选择s3上的json文件创建表结构,也可以用脚本里的

复制代码
manifest_demo_reviews_v1.json上传S3创建。     

(2)本地文件生成dataset的表结构,并上传S3自动更新,脚本参考:

复制代码
import boto3
import botocore
import json
import uuid
import time
from datetime import datetime

quicksight_dataset_cache={'demo_reviews_v1': '14194554-2b79-47a9-8b00-c849ea4a23cd'}

def get_aws_boto3_config(region_name):
    bsession = boto3.Session(
        region_name=region_name,
        aws_access_key_id="",
        aws_secret_access_key=""
    )
    https_config = botocore.config.Config(
        signature_version='s3v4'
    )
    return bsession, https_config

def upload_to_s3(file_path, bucket_name, s3_key):
    """Upload file to S3 bucket.

    Args:
        bucket_name: S3 bucket name.
        file_path: File path to upload.
        s3_key: S3 file key.
    """
    region_name = 'us-east-1'
    aws_se, conf = get_aws_boto3_config(region_name)
    s3 = aws_se.client('s3', config=conf)
    s3.upload_file(file_path, bucket_name, s3_key)

def list_all_datasets(account_id, quicksight):
    """分页获取所有数据集"""
    datasets = []
    next_token = None
    while True:
        if next_token:
            response = quicksight.list_data_sets(AwsAccountId=account_id, NextToken=next_token)
        else:
            response = quicksight.list_data_sets(AwsAccountId=account_id)
        datasets.extend(response["DataSetSummaries"])
        next_token = response.get("NextToken")
        if not next_token:
            break
    # print(f'datasets==>{datasets}')
    return datasets

def get_dataset_id_by_name(account_id, dataset_name, quicksight):
    """根据数据集名称查找 DataSetId"""
    if dataset_name not in quicksight_dataset_cache:
        datasets = list_all_datasets(account_id, quicksight)
        for ds in datasets:
            if 'demo_' in ds["Name"]:
                quicksight_dataset_cache[ds["Name"]] = ds["DataSetId"]
    dataset_id = quicksight_dataset_cache[dataset_name] if dataset_name in quicksight_dataset_cache else None
    return dataset_id

# Refresh dataset
def update_quicksight_dataset(dataset_name):
    try:
        aws_se, conf = get_aws_boto3_config('us-east-1')
        quicksight = aws_se.client('quicksight', config=conf)
        sts = aws_se.client('sts', config=conf)
        account_id = sts.get_caller_identity()['Account']
        dataset_id = get_dataset_id_by_name(account_id, dataset_name, quicksight)
        if not dataset_id:
            print(f'ERROR: update_quicksight_dataset===>no dataset_id')
            return
        ingestion_id = str(int(time.time()))

        # For SPICE dataset, use FULL_REFRESH
        quicksight.create_ingestion(
            AwsAccountId=account_id,
            DataSetId=dataset_id,
            IngestionId=ingestion_id,
            IngestionType='FULL_REFRESH'
        )
        print(f"QuickSight dataset refresh successful: {dataset_name}")
    except Exception as e:
        print(f'ERROR: update_quicksight_dataset===>dataset_name={dataset_name}, e = {e}')

def demo_reviews_analysis(file_name, output_path, version):
    with open(file_name, 'r', encoding='utf-8') as f:
        content = json.load(f)
    # 此处省略 content的解析过程,以data_list为示例
    data_list = [{
        "id": "",
        "name": "",
        "date": ""
    }]
    data_list.append(item_obj)
    file_save_path = f'{output_path}/demo_reviews_{version}.json'
    with open(file_save_path, 'w', encoding='utf-8') as f:
        json.dump(data_list, f, indent=2, ensure_ascii=False)
    
    # Upload data file
    data_s3_key = f'upload/{output_path}/demo_reviews_{version}.json'
    upload_to_s3(file_save_path, bucket_name='test_bucket', s3_key=data_s3_key)
    
    # Create and upload manifest file
    manifest = {
        "fileLocations": [{"URIs": [f"s3://test_bucket/{data_s3_key}"]}],
        "globalUploadSettings": {"format": "JSON"}
    }
    manifest_path = f'{output_path}/manifest_demo_reviews_{version}.json'
    with open(manifest_path, 'w') as f:
        json.dump(manifest, f)
    upload_to_s3(manifest_path, bucket_name='test_bucket', s3_key=f'upload/{output_path}/manifest_demo_reviews_{version}.json')
    update_quicksight_dataset(f'demo_reviews_{version}')

if __name__ == "__main__":
    version = 'v1'  #Different version configuration names
    source_path = f'source_{version}'  #Original file
    output_path = f'domo_data_{version}'
    demo_reviews_path = f'{source_path}/demo_reviews.json'
    demo_reviews_analysis(demo_reviews_path, f'{output_path}', version)
  1. 创建analysis,然后可以选择如下各种图表样式创建:
  1. 如果需要一些像excel一样的计算方式,可以点增加计算,支持各种类似excel的计算方式。

5.页面创作完成之后要点右上角publish,然后share dashboard分享给想要看到的人。

6.要是想要分享给一个群组,可以点右上角头像后,选择管理quicksight,创建一个群组,之后把上面页面分享给群组,组内的成员就都能看到页面。

相关推荐
亚马逊云开发者12 小时前
都2026了,你的游戏服务器还在裸奔?聊聊用Player Gateway彻底隐藏IP的DDoS防护方案
aws
翼龙云_cloud19 小时前
亚马逊云代理商:三步用 CloudWatch 高效监控 AWS Lambda 日志
云计算·aws·云服务器
zhojiew1 天前
关于AWS Direct Connect with Transit Gateway和Direct Connect Gateway
云计算·gateway·aws
观测云1 天前
AWS DevOps Agent 接入观测云最佳实践
aws·devops·可观测性·观测云
亚马逊云开发者4 天前
试了 8 种方式全失败后,我用双通道架构把 Kiro CLI 变成了 REST API
aws
亚马逊云开发者4 天前
两个 AI Agent 互相调用是什么体验?Kiro + OpenClaw 双协议实战,架构评审从 2 天干到 15 分钟
aws
亚马逊云开发者4 天前
更新个监控 Agent 要协调 200 个团队?Amazon ECS 托管守护进程终于把平台工程师从苦海里捞出来了
aws
亚马逊云开发者5 天前
5 个 Agent 协同处理金融业务,我用 Kiro + AgentCore 半天就部署上线了
aws
亚马逊云开发者5 天前
我把 Claude Code 的 Token 费砍了 70%,只用了 SageMaker + 一个路由 Hook
aws
圣殿骑士-Khtangc5 天前
Amazon CodeWhisperer 超详细使用教程:AWS 云原生 AI 编程助手上手指南
人工智能·ai编程·aws·编程助手·codewhisperer