Amazon Athena:S3 上的无服务器 SQL
在 Athena 中使用标准 SQL 直接查询 S3 数据,使用 Parquet 和 ORC 等列式格式进行优化,并通过分区控制成本
Amazon Athena:S3 上的无服务器 SQL 是 CoddyKit 上的免费 Cloud & IT Cert Prep 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cloud & IT Cert Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cloud & IT Cert Prep 课程共包含 4 节课。
什么是 Amazon Athena
Amazon Athena 是一项无服务器交互式查询服务,可让您直接对存储在 Amazon S3 中的数据运行标准 SQL。您无需预置服务器,也无需管理集群,并且只需为每次查询扫描的数据付费(每扫描约 1 TB 数据需支付 5 美元)。Athena 底层使用 Presto,并与 Glue Data Catalogue 原生集成,以获取表元数据。
设置 Athena:工作组和输出位置
运行查询前,请配置一个 Athena 工作组,并指定用于输出查询结果的 S3 路径。工作组支持在团队之间分别管理查询历史和成本跟踪、强制对结果进行加密,并设置每次查询的数据扫描上限,以防止成本失控。每个查询结果都会以 CSV 格式写入配置的 S3 输出存储桶。
# Create a workgroup with an encrypted output location
aws athena create-work-group \
--name analytics-team \
--configuration '{
"ResultConfiguration": {
"OutputLocation": "s3://athena-results-123/analytics-team/",
"EncryptionConfiguration": {"EncryptionOption": "SSE_S3"}
},
"EnforceWorkGroupConfiguration": true,
"PublishCloudWatchMetricsEnabled": true,
"BytesScannedCutoffPerQuery": 10737418240
}'运行您的第一个查询
将 Athena 指向 Glue Data Catalogue 数据库,然后运行 ANSI SQL。Athena 支持 SELECT、JOIN、GROUP BY、窗口函数和 CTE。您还可以使用 CREATE TABLE AS SELECT (CTAS),将查询结果以 Parquet 格式保存为新表,从而有效地物化中间结果,加快后续查询。
-- Query total sales by month from partitioned S3 data
SELECT
year,
month,
SUM(order_total) AS monthly_revenue
FROM my_db.curated_sales
WHERE year = '2024'
GROUP BY year, month
ORDER BY month;
-- CTAS: materialise result as Parquet for reuse
CREATE TABLE my_db.monthly_revenue
WITH (format = 'PARQUET', external_location = 's3://my-data-lake-123/curated/monthly_revenue/')
AS
SELECT year, month, SUM(order_total) AS revenue
FROM my_db.curated_sales
GROUP BY year, month;成本优化:分区裁剪
Athena 按扫描的数据量计费,每 TB 扫描数据收取相应费用。最有效的成本降低方法是分区裁剪:始终在 WHERE 子句中包含分区列。如果数据按 year/month/day 分区,筛选这些列即可避免 Athena 扫描其他分区。如果面对 PB 级表时没有使用分区筛选,即使是简单查询也可能产生数百美元的费用。
-- EXPENSIVE: No partition filter -> scans all data
SELECT * FROM my_db.curated_sales WHERE customer_id = '12345';
-- CHEAP: Partition filter applied -> scans only Jan 2024
SELECT * FROM my_db.curated_sales
WHERE year = '2024' AND month = '01' AND customer_id = '12345';成本优化:列式格式
将数据存储为 Apache Parquet 或 ORC,而不是 CSV 或 JSON,可以大幅减少 Athena 每次查询扫描的数据量。列式查询如果只访问 50 列中的 3 列,就只会扫描磁盘上这 3 列的数据。结合内置压缩(Snappy、Zstd),Parquet 文件通常比等效的 CSV 文件小 5–10 倍,从而进一步放大成本节省效果。
-- After converting raw CSV to Parquet:
-- CSV version: 500 GB table, query scans 500 GB -> $2.50
-- Parquet version: same data compressed to 50 GB,
-- query reads only 2 columns -> scans ~2 GB -> $0.01
-- Verify table format in Glue Catalogue
SHOW CREATE TABLE my_db.curated_sales;使用数据源连接器执行联合查询
Athena 联合查询通过基于 Lambda 的数据源连接器扩展了 Athena 的查询范围,使其不仅能查询 S3,还能查询 RDS、DynamoDB、Redshift、Elasticsearch 和自定义数据源。您可以从 Serverless Application Repository 部署连接器 Lambda 函数,将其注册为 Athena 数据源,然后在单个 SQL JOIN 中跨 S3 表和实时数据库进行查询,无需事先移动任何数据。
-- Federated query: join S3 Parquet with live RDS table
SELECT s.order_id, s.total, c.email
FROM my_db.curated_sales s
JOIN rds_lambda.prod_db.customers c
ON s.customer_id = c.id
WHERE s.year = '2024' AND s.month = '01';Athena 与 QuickSight 的集成
Amazon QuickSight 可直接连接 Athena 作为数据源,让业务分析师无需中间数据库即可根据 S3 数据构建交互式控制面板。QuickSight 使用 SPICE(超快并行内存计算引擎)缓存 Athena 查询结果,以便快速呈现控制面板。这个无服务器 BI 技术栈(S3 + Glue + Athena + QuickSight)是考试中常见的经济高效分析方案。
优化 Athena 查询性能
除了分区和列式格式外,您还可以通过以下方式进一步优化 Athena 查询:拆分大文件(为了实现并行处理,每个文件建议为 128 MB–1 GB),对经常参与连接的列使用分桶,避免使用 SELECT *,以及在不要求精确值时使用 近似聚合函数,例如 approx_distinct() 和 approx_percentile()。这些技术可以同时降低成本和延迟。
-- Use approx_distinct for fast cardinality estimate
SELECT
year,
approx_distinct(customer_id) AS approx_unique_customers
FROM my_db.curated_sales
WHERE year = '2024'
GROUP BY year;控制 Athena 的访问权限
Athena 与 IAM 集成以实现访问控制:用户需要运行 Athena 查询的权限(athena:StartQueryExecution)、访问 S3 输出存储桶的权限,以及读取底层 S3 数据的权限。如需精细控制列级和行级访问权限,请将 Athena 与 Lake Formation 结合使用。您还可以通过针对工作组 ARN 的 IAM 条件键,将工作组限制为只能访问特定数据库。
# Minimum IAM policy for an Athena analyst
{
"Effect": "Allow",
"Action": [
"athena:StartQueryExecution",
"athena:GetQueryExecution",
"athena:GetQueryResults",
"athena:StopQueryExecution",
"glue:GetDatabase",
"glue:GetTable",
"glue:GetPartitions",
"s3:GetObject",
"s3:PutObject"
],
"Resource": "*"
}保存查询结果和计划查询
Athena 查询结果会以 CSV 文件的形式存储在 S3 中,并缓存 7 天,因此在此期间重新运行完全相同的查询时,不会再次扫描数据。对于定期报表需求,请使用 Athena 计划查询,按照 cron 计划运行查询,并将结果保存到新的 S3 位置或直接保存到表中。您也可以通过 Step Functions 状态机或 EventBridge 规则触发 Athena 查询。
# Start an Athena query via CLI and retrieve results
QUERY_ID=$(aws athena start-query-execution \
--query-string 'SELECT COUNT(*) FROM my_db.curated_sales WHERE year=2024' \
--work-group analytics-team \
--query 'QueryExecutionId' --output text)
# Wait and fetch results
aws athena get-query-results --query-execution-id $QUERY_IDAthena 与 Redshift:选择合适的工具
对于 SAA-C03 考试,您需要了解何时推荐 Athena,何时推荐 Redshift。在 S3 上执行临时且不频繁的查询,并且不想管理基础设施时,请选择 Athena。当您需要对复杂连接实现亚秒级响应时间、有专门的分析团队同时运行数百个查询,或者希望使用 Redshift Spectrum 通过 S3 数据扩展数据仓库时,请选择 Redshift。关键判断依据是查询的频率和复杂程度。
快速检查
测试您对本课 AWS Solutions Architect (SAA-C03) 概念的理解。
课程回顾
本课您学到了:Athena 按扫描数据量计费,因此分区裁剪和 Parquet 格式是控制成本的关键,Athena 联合查询通过 Lambda 连接器将 SQL 查询扩展到非 S3 数据源,以及 Athena 最适合临时查询,而 Redshift 更适合高并发分析。接下来我们将探索 Kinesis,用于实时数据流处理和分析。
常见问题解答
「Amazon Athena:S3 上的无服务器 SQL」课时是免费的吗?
是的 — 「Amazon Athena:S3 上的无服务器 SQL」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cloud & IT Cert Prep 课程的其余内容,请升级到 CoddyKit PRO。 Cloud & IT Cert Prep 课程共包含 4 节课。
「Amazon Athena:S3 上的无服务器 SQL」这节课中我会学到什么?
在 Athena 中使用标准 SQL 直接查询 S3 数据,使用 Parquet 和 ORC 等列式格式进行优化,并通过分区控制成本 你通过在浏览器中直接运行的动手代码来练习 Cloud & IT Cert Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cloud & IT Cert Prep 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cloud & IT Cert Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「Amazon Athena:S3 上的无服务器 SQL」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cloud & IT Cert Prep 课中编写并运行代码吗?
能。每节 Cloud & IT Cert Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 在 S3 上构建数据湖
- AWS Glue:ETL 与数据目录
- Amazon Athena:S3 上的无服务器 SQL
- Kinesis Streams、Firehose 与实时分析