Home DevOps Amazon Athena: Serverless SQL Query Service – Stop Paying for Idle Warehouses
Intermediate 5 min · July 18, 2026

Amazon Athena: Serverless SQL Query Service – Stop Paying for Idle Warehouses

Amazon Athena serverless SQL query service lets you query S3 data with standard SQL.

N
Naren Founder & Principal Engineer

20+ years shipping production infrastructure and CI/CD at scale. Everything here is grounded in real deployments.

Follow
Production
production tested
July 18, 2026
last updated
2,466
articles · all by Naren
Before you start⏱ 25 min
  • Basic SQL knowledge
  • Familiarity with AWS S3
  • Understanding of data formats (Parquet, CSV, JSON)
  • AWS console access
 ● Production Incident 🔎 Debug Guide ⚙ Triage Commands
Quick Answer

Amazon Athena lets you run SQL queries on data stored in S3 without setting up any servers. You just point it at your data, define a schema (or let it infer one), and start querying. Pricing is per TB of data scanned.

✦ Definition~90s read
What is Amazon Athena?

Amazon Athena is a serverless interactive query service that lets you analyze data directly in Amazon S3 using standard SQL. You pay only for the data scanned per query. No infrastructure to manage.

Imagine you have a giant warehouse full of filing cabinets (your S3 buckets).
Plain-English First

Imagine you have a giant warehouse full of filing cabinets (your S3 buckets). Normally, you'd need to rent a forklift and hire a crew (provision a data warehouse) to go through the files. Athena is like hiring a team of ninjas who only get paid for the time they actually spend searching. They show up, find exactly what you asked for, and leave. No monthly rent, no idle crew.

You're paying for a data warehouse that sits idle 90% of the time. That's the dirty secret of traditional analytics: you provision for peak load, then watch the bills pile up while nothing runs. Athena flips that model. You query S3 data directly with standard SQL, and you only pay for the bytes you scan. No clusters, no provisioning, no midnight panics about concurrency limits.

The problem Athena solves is simple: data is already in S3. Why move it to a separate warehouse just to run a few ad-hoc queries? Before Athena, teams either spun up Redshift clusters (expensive and slow to start) or wrote custom MapReduce jobs (painful). Athena gives you instant SQL access to your data lake.

By the end of this, you'll know exactly when to use Athena, how to optimize it to avoid burning cash on full table scans, and the gotchas that will make you hate it if you ignore them. You'll also know when to walk away and use a real database instead.

Why Athena Exists: The Serverless Data Warehouse Myth

Traditional data warehouses are like owning a truck for the one day a month you move furniture. You pay for the truck every day, even when it's parked. Athena is Uber for SQL: you call it when you need it, pay per ride, and never worry about maintenance.

The real innovation isn't serverless—it's the separation of compute from storage. Athena runs on a massive fleet of Presto instances that AWS manages. Your data stays in S3. When you submit a query, Athena spins up workers, reads data from S3, executes the query, and returns results. Then the workers vanish.

This is brilliant for ad-hoc analysis, one-off reports, and querying data that's already in S3. But it's terrible for high-frequency, low-latency queries. Athena has a multi-second startup overhead per query. If you need sub-second response times, you need a real database.

first_query.sqlSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-- io.thecodeforge — DevOps tutorial

-- Create a table pointing to S3 data
CREATE EXTERNAL TABLE IF NOT EXISTS sales_data (
  order_id STRING,
  customer_id STRING,
  amount DOUBLE,
  order_date DATE
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = ',',
  'field.delim' = ','
)
LOCATION 's3://my-bucket/sales/';

-- Run a query
SELECT customer_id, SUM(amount) as total
FROM sales_data
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
ORDER BY total DESC
LIMIT 10;

-- Output: 10 rows with customer totals
Output
customer_id | total
C001 | 12500.50
C002 | 9800.00
... (8 more rows)
⚠ Production Trap: Unpartitioned Data
If you don't partition your data, every query scans the entire table. For a 1 TB table, that's $5 per query. Partition by date or another high-cardinality column to limit scans.

Setting Up Athena: The Right Way, Not the Quick Way

Most tutorials tell you to use the console's 'Create Table' wizard. Don't. That's fine for a demo, but in production you need version-controlled DDL in your CI/CD pipeline. Athena tables are just Hive metastore definitions stored in Glue Data Catalog.

You have two options: use AWS Glue Crawlers to auto-discover schemas, or write manual CREATE EXTERNAL TABLE statements. Glue Crawlers are convenient but can be slow and sometimes infer wrong types (e.g., INT for a column that should be STRING). For production, I recommend manual DDL with explicit types and partitions.

Always store your DDL in a Git repository. When you need to change a schema, run the ALTER TABLE through your deployment pipeline. This prevents drift between environments.

create_table_partitioned.sqlSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-- io.thecodeforge — DevOps tutorial

-- Create a partitioned table with Parquet format
CREATE EXTERNAL TABLE IF NOT EXISTS sales_partitioned (
  order_id STRING,
  customer_id STRING,
  amount DOUBLE
)
PARTITIONED BY (order_date STRING)  -- Partition column not in schema
STORED AS PARQUET
LOCATION 's3://my-bucket/sales_partitioned/';

-- Load partitions (after data is in S3)
MSCK REPAIR TABLE sales_partitioned;
-- Or use ALTER TABLE ADD PARTITION for new partitions

-- Query with partition pruning
SELECT * FROM sales_partitioned
WHERE order_date = '2024-01-15';  -- Only scans one partition folder
Output
order_id | customer_id | amount
O1001 | C001 | 250.00
... (rows only from that date)
🔥Senior Shortcut: Partition Projection
For high-cardinality partitions (e.g., customer_id), use partition projection instead of MSCK REPAIR. It's faster and doesn't require partition metadata in Glue. Define the projection in the table properties.

Optimizing Costs: Don't Let a Single Query Bankrupt You

Athena pricing is simple: $5 per TB of data scanned. That sounds cheap until someone runs a SELECT * on a 10 TB table. The key to cost control is reducing scan size. Three levers: format, partitioning, and compression.

First, use columnar formats. Parquet and ORC store data by column, not by row. When you query only a few columns, Athena reads only those columns. CSV and JSON store everything row-wise, forcing a full scan even for a single column. Switching from CSV to Parquet typically reduces scan size by 70-90%.

Second, partition your data. Athena can prune partitions if your WHERE clause filters on partition columns. Without partitions, you scan everything.

Third, compress your data. Snappy compression is fast and reduces storage and scan size. Athena can read compressed Parquet directly.

Set cost limits via Workgroups. You can cap the amount of data a query can scan. If a query exceeds the limit, Athena cancels it. This prevents runaway costs.

cost_control.sqlSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
-- io.thecodeforge — DevOps tutorial

-- Create a Workgroup with scan limit (via AWS Console or CLI)
-- aws athena create-work-group --name analytics --configuration ResultConfiguration={OutputLocation=s3://my-bucket/results/},EnforceWorkGroupConfiguration=true,PublishCloudWatchMetricsEnabled=true,BytesScannedCutoffPerQuery=1099511627776

-- Query that respects partition pruning
SELECT customer_id, COUNT(*) as order_count
FROM sales_partitioned
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31'
  AND amount > 100
GROUP BY customer_id;

-- Check scan size in the console or via CloudWatch metrics
Output
customer_id | order_count
C001 | 45
C002 | 32
...
⚠ Never Do This: SELECT * on Production Tables
SELECT * on a large table is the #1 cause of Athena bill shock. Always specify columns and use WHERE clauses that leverage partitions. If you must explore, use LIMIT 100.

Performance Tuning: Why Your Query Is Slow and What to Do

Athena's performance depends on data layout, not hardware. You can't add more nodes. You have to optimize the data.

First, file size matters. Athena works best with files between 64 MB and 256 MB. Too many small files (e.g., millions of 1 KB files) cause overhead in listing and reading. Too few large files reduce parallelism. Use a compaction job (e.g., Spark or Athena CTAS) to merge small files.

Second, use columnar formats with compression. Parquet + Snappy is the sweet spot. ORC is also good but less common.

Third, partition wisely. Don't over-partition. A partition per day is usually fine. Partition per hour creates too many small partitions and slows down partition discovery.

Fourth, use ORDER BY and LIMIT carefully. ORDER BY requires a full scan of the data because Athena must sort all rows. If you only need the top N, use LIMIT after ORDER BY, but Athena still scans everything. For top-N queries, consider using approximate functions like APPROX_PERCENTILE.

Finally, use CTAS (CREATE TABLE AS SELECT) to materialize intermediate results. If you run the same aggregation daily, write the result to a new table and query that instead of the raw data.

ctas_optimization.sqlSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-- io.thecodeforge — DevOps tutorial

-- Materialize daily aggregation
CREATE TABLE daily_sales_summary
WITH (
  format = 'PARQUET',
  partitioned_by = ARRAY['order_date'],
  external_location = 's3://my-bucket/aggregates/daily_sales/'
) AS
SELECT order_date, customer_id, SUM(amount) as total_amount, COUNT(*) as order_count
FROM sales_partitioned
WHERE order_date >= '2024-01-01'
GROUP BY order_date, customer_id;

-- Now query the materialized table
SELECT * FROM daily_sales_summary
WHERE order_date = '2024-01-15'
ORDER BY total_amount DESC
LIMIT 10;

-- Much faster and cheaper than scanning raw data
Output
order_date | customer_id | total_amount | order_count
2024-01-15 | C001 | 1250.00 | 5
2024-01-15 | C002 | 980.00 | 3
...
💡Interview Gold: CTAS for Cost Optimization
CTAS is a powerful pattern for reducing costs. Materialize expensive aggregations into partitioned Parquet tables. Then point dashboards at the materialized tables. This can cut costs by 90%.

When Athena Breaks: The Gotchas You'll Hit in Production

Athena is not a database. It's a query engine on top of a data lake. That means no ACID transactions, no indexes, no concurrent writes. Here are the pain points:

  1. No UPDATE or DELETE. Athena only supports INSERT (via CTAS or INSERT INTO). If you need to modify data, you have to rewrite the entire partition or table. This is painful for slowly changing dimensions.
  2. Concurrent query limits. By default, Athena allows 20 concurrent queries per account. You can increase this via Workgroups, but there's a hard limit. If you have many users, you'll hit throttling.
  3. Query queueing. When concurrency is exceeded, queries are queued. The queue timeout is 30 minutes by default. If your query doesn't start within that time, it fails.
  4. No built-in data governance. Athena doesn't enforce row-level security. If you need fine-grained access control, you have to implement it via views or external tools.
  5. Cold start latency. The first query after a period of inactivity can take 10-20 seconds just to spin up workers. This is not suitable for interactive dashboards that need sub-second response.
  6. Schema-on-read limitations. Athena uses Hive metastore, which doesn't support nested data types well. Complex nested structures (arrays of structs) can be slow to query.
workaround_update.sqlSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- io.thecodeforge — DevOps tutorial

-- Workaround for UPDATE: rewrite the partition
-- Step 1: Create a temporary table with the updated data
CREATE TABLE temp_sales AS
SELECT order_id, customer_id, amount, order_date
FROM sales_partitioned
WHERE order_date = '2024-01-15'
  AND order_id != 'O1001'  -- exclude the row to 'delete'
UNION ALL
SELECT 'O1001' as order_id, 'C001' as customer_id, 300.0 as amount, '2024-01-15' as order_date;  -- updated row

-- Step 2: Overwrite the partition in S3 (via CTAS or external tool)
-- Then drop the old partition and add the new one
ALTER TABLE sales_partitioned DROP PARTITION (order_date='2024-01-15');
ALTER TABLE sales_partitioned ADD PARTITION (order_date='2024-01-15') LOCATION 's3://my-bucket/sales_partitioned/order_date=2024-01-15/';

-- Not elegant, but it works.
Output
No direct output. The partition is replaced.
⚠ The Classic Bug: Overwriting Partitions
When you rewrite a partition, make sure the new data is complete before you swap. If you drop the partition first and then fail to add the new one, you lose data. Use a two-step process: write to a staging location, then swap.

Athena vs. Redshift vs. EMR: When to Use What

This is the most common decision you'll face. Here's my rule of thumb:

  • Use Athena when: You have data in S3, queries are ad-hoc or infrequent, latency of a few seconds is acceptable, and you want zero ops. Athena is perfect for one-off analysis, log querying, and data lake exploration.
  • Use Redshift when: You need sub-second query performance, support for concurrent users (hundreds), ACID transactions, or you're building a traditional BI dashboard. Redshift is a real database with indexes, materialized views, and workload management.
  • Use EMR (Spark/Hive) when: You need complex ETL, machine learning, or processing that doesn't fit SQL. EMR gives you full control over compute and can handle massive transformations.
  • Use Redshift Spectrum when: You need to query both Redshift tables and S3 data in a single query. Spectrum is a bridge between Redshift and Athena-like functionality.

Athena is not a replacement for Redshift. It's a complement. Use Athena for the data lake, Redshift for the data warehouse.

spectrum_example.sqlSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- io.thecodeforge — DevOps tutorial

-- Redshift Spectrum: Query S3 data from Redshift
CREATE EXTERNAL TABLE spectrum.sales (
  order_id VARCHAR(100),
  amount DECIMAL(10,2)
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
LOCATION 's3://my-bucket/sales/';

-- Join Redshift table with Spectrum table
SELECT r.customer_name, s.amount
FROM redshift_customers r
JOIN spectrum.sales s ON r.customer_id = s.customer_id
WHERE s.order_date = '2024-01-15';
Output
customer_name | amount
John Doe | 250.00
...
🔥Senior Shortcut: Use Athena for Data Lake, Redshift for Warehouse
Don't force everything into one tool. Athena is great for raw data exploration and ad-hoc queries. Redshift is for production dashboards and reports. Use S3 as the single source of truth, and query it with the right tool for the job.

Production Patterns: How to Operate Athena at Scale

Running Athena in production means more than just writing SQL. You need monitoring, cost controls, and automation.

  1. Monitoring: Enable CloudWatch metrics for each Workgroup. Track EngineExecutionTime, DataScannedInBytes, and QueryQueueTime. Set alarms for high scan sizes or long queue times.
  2. Cost Allocation: Use Workgroups to separate teams or environments. Each Workgroup can have its own cost limit and output location. Tag queries with workgroup for cost reporting.
  3. Automation: Use the Athena API or SDK to submit queries programmatically. For scheduled queries, use AWS Lambda + EventBridge. For complex workflows, use Step Functions.
  4. Result Caching: Athena caches query results for 30 minutes by default. If you run the same query twice, the second run returns cached results instantly. You can disable this per query if you need fresh data.
  5. Data Lifecycle: Use S3 lifecycle policies to expire old data. Athena queries on expired data will fail. Also, clean up temporary tables and CTAS outputs to avoid clutter.
lambda_athena.pyPYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# io.thecodeforge — DevOps tutorial

import boto3
import time

athena = boto3.client('athena')

def run_athena_query(query, database, output_location):
    response = athena.start_query_execution(
        QueryString=query,
        QueryExecutionContext={'Database': database},
        ResultConfiguration={'OutputLocation': output_location}
    )
    query_execution_id = response['QueryExecutionId']
    
    # Poll for completion
    while True:
        status = athena.get_query_execution(QueryExecutionId=query_execution_id)
        state = status['QueryExecution']['Status']['State']
        if state in ['SUCCEEDED', 'FAILED', 'CANCELLED']:
            break
        time.sleep(1)
    
    if state == 'SUCCEEDED':
        results = athena.get_query_results(QueryExecutionId=query_execution_id)
        return results
    else:
        raise Exception(f"Query failed: {status['QueryExecution']['Status']['StateChangeReason']}")

# Example usage
query = "SELECT COUNT(*) FROM sales_partitioned WHERE order_date = '2024-01-15'"
result = run_athena_query(query, 'mydatabase', 's3://my-bucket/results/')
print(result)
Output
{
'ResultSet': {
'Rows': [{'Data': [{'VarCharValue': '_col0'}]}, {'Data': [{'VarCharValue': '12345'}]}]
}
}
💡Production Trap: Polling for Query Completion
Don't poll in a tight loop. Use exponential backoff or subscribe to SNS notifications via CloudWatch Events. Athena can send events when queries complete.

Security: Locking Down Athena in a Multi-Tenant Environment

Athena's security model is simple: IAM policies control who can run queries, and S3 policies control who can read the underlying data. But there are nuances.

  1. Least privilege: Grant only the necessary actions. For users who only need to query, allow athena:StartQueryExecution and athena:GetQueryResults. Don't grant athena:CreateWorkGroup.
  2. Data access: Athena reads data from S3 on behalf of the user. The IAM user must have s3:GetObject permission on the data location. Use bucket policies to restrict access to specific prefixes.
  3. Encryption: Enable S3 server-side encryption (SSE-S3 or SSE-KMS). Athena can read encrypted data if the IAM role has kms:Decrypt permission.
  4. Audit: Enable CloudTrail for Athena API calls. Also enable S3 access logs to track data access.
  5. Row-level security: Athena doesn't support it natively. Create views that filter rows based on the user's identity (using current_user or a mapping table). But this is fragile. Consider using a separate table per tenant.
row_level_security_view.sqlSQL
1
2
3
4
5
6
7
8
9
10
11
-- io.thecodeforge — DevOps tutorial

-- Create a view that filters by customer_id based on user mapping
CREATE VIEW customer_sales AS
SELECT s.*
FROM sales_partitioned s
JOIN user_customer_mapping m ON s.customer_id = m.customer_id
WHERE m.username = current_user;

-- Now users can query the view and only see their data
SELECT * FROM customer_sales WHERE order_date = '2024-01-15';
Output
Rows filtered by the user's customer mapping.
⚠ Never Do This: Granting Full S3 Access to Athena Users
If your Athena users have broad S3 access, they can query any data in the bucket, even data from other tenants. Always scope S3 permissions to the specific prefixes they need.
● Production incidentPOST-MORTEMseverity: high

The $10,000 Query That Scanned Everything

Symptom
A developer ran a SELECT * on a 5 TB unpartitioned CSV dataset. The query took 45 minutes and cost $50. But the real problem: they had 200 similar queries queued up in a cron job.
Assumption
The team assumed Athena would only scan the columns referenced in the WHERE clause.
Root cause
Athena scans all data in the table unless you use columnar formats (Parquet/ORC) or partition pruning. CSV and JSON force full scans. The cron job was running hourly, costing $10,000 per day.
Fix
Converted data to Parquet with Snappy compression. Partitioned by date. Rewrote queries to filter on partition columns. Reduced scan size by 95%.
Key lesson
  • Never store production analytics data in CSV or JSON.
  • Always use columnar formats and partition by high-cardinality columns like date.
Production debug guideSystematic recovery paths for the failure modes engineers actually hit.3 entries
Symptom · 01
Query fails with 'HIVE_CANNOT_OPEN_SPLIT'
Fix
1. Check S3 bucket permissions. 2. Verify the file format matches the table definition. 3. Check for corrupt files in the partition.
Symptom · 02
Query is slow despite small data
Fix
1. Check if data is in columnar format. 2. Verify partition pruning is working (look at 'Partitions scanned' in the query details). 3. Check for many small files.
Symptom · 03
Costs are unexpectedly high
Fix
1. Enable cost limits via Workgroups. 2. Review CloudWatch metrics for DataScannedInBytes. 3. Identify queries scanning large amounts of data and optimize them.
★ Amazon Athena Triage Cheat SheetFirst-response commands for when things go wrong — copy-paste ready.
Query fails with `HIVE_CANNOT_OPEN_SPLIT`
Immediate action
Check S3 permissions and file format
Commands
aws s3 ls s3://my-bucket/path/ --recursive | head -20
aws athena get-query-execution --query-execution-id <id> --query 'QueryExecution.Status.StateChangeReason'
Fix now
Ensure the IAM role has s3:GetObject on the bucket. Verify the file extension matches the table's STORED AS clause.
Query returns no results but should+
Immediate action
Check partition metadata
Commands
SHOW PARTITIONS table_name;
SELECT COUNT(*) FROM table_name;
Fix now
Run MSCK REPAIR TABLE table_name; or ALTER TABLE ADD PARTITION for missing partitions.
Query is too slow+
Immediate action
Check scan size and format
Commands
Check query details in console for 'Data scanned'
EXPLAIN ANALYZE SELECT ...
Fix now
Convert to Parquet, add partitions, use column pruning.
Query fails with 'Query timeout'+
Immediate action
Check queue time and execution time
Commands
aws athena get-query-execution --query-execution-id <id> --query 'QueryExecution.Status'
Check CloudWatch metric 'QueryQueueTime'
Fix now
Increase Workgroup concurrency limit or reduce query complexity.
FeatureAthenaRedshift
Setup timeMinutes (no provisioning)30-60 minutes (cluster provisioning)
PricingPer query ($5/TB scanned)Per hour (cluster cost)
PerformanceSeconds to minutesMilliseconds to seconds
ConcurrencyLimited (20 default, up to 100+)High (hundreds of concurrent queries)
Data modificationINSERT only (no UPDATE/DELETE)Full DML (INSERT, UPDATE, DELETE)
Best forAd-hoc queries, data lakeProduction BI, real-time dashboards
⚙ Quick Reference
8 commands from this guide
FileCommand / CodePurpose
first_query.sqlCREATE EXTERNAL TABLE IF NOT EXISTS sales_data (Why Athena Exists
create_table_partitioned.sqlCREATE EXTERNAL TABLE IF NOT EXISTS sales_partitioned (Setting Up Athena
cost_control.sqlSELECT customer_id, COUNT(*) as order_countOptimizing Costs
ctas_optimization.sqlCREATE TABLE daily_sales_summaryPerformance Tuning
workaround_update.sqlCREATE TABLE temp_sales ASWhen Athena Breaks
spectrum_example.sqlCREATE EXTERNAL TABLE spectrum.sales (Athena vs. Redshift vs. EMR
lambda_athena.pyathena = boto3.client('athena')Production Patterns
row_level_security_view.sqlCREATE VIEW customer_sales ASSecurity

Key takeaways

1
Athena is for ad-hoc queries on data lakes, not for production OLTP or real-time dashboards.
2
Always use columnar formats (Parquet/ORC) and partition by high-cardinality columns to minimize scan size and cost.
3
CTAS is your best friend for materializing expensive aggregations and reducing query costs by 90%.
4
Athena has no UPDATE/DELETE
plan your data model accordingly. Use partition overwrites for data corrections.
INTERVIEW PREP · PRACTICE MODE

Interview Questions on This Topic

Q01SENIOR
How does Athena handle concurrent queries, and what happens when the lim...
Q02SENIOR
When would you choose Athena over Redshift Spectrum for querying S3 data...
Q03SENIOR
What happens when you run a SELECT * on a large unpartitioned CSV table ...
Q04JUNIOR
What is the difference between Athena and a traditional database?
Q05SENIOR
You notice a query that used to take 10 seconds now takes 5 minutes. Wha...
Q06SENIOR
How would you design a cost-effective analytics pipeline using Athena fo...
Q01 of 06SENIOR

How does Athena handle concurrent queries, and what happens when the limit is exceeded?

ANSWER
Athena has a default concurrency limit of 20 queries per account. When exceeded, queries are queued with a 30-minute timeout. You can increase the limit via Workgroups, but there's a hard account-level limit. For high concurrency, consider using Redshift or caching results.
FAQ · 4 QUESTIONS

Frequently Asked Questions

01
How much does Amazon Athena cost?
02
What's the difference between Athena and Redshift?
03
How do I optimize Athena query performance?
04
Can Athena update or delete data?
N
Naren Founder & Principal Engineer

20+ years shipping production infrastructure and CI/CD at scale. Everything here is grounded in real deployments.

Follow
Verified
production tested
July 18, 2026
last updated
2,466
articles · all by Naren
🔥

That's AWS. Mark it forged?

5 min read · try the examples if you haven't

Previous
AWS Glue: Serverless ETL and Data Catalog
51 / 63 · AWS
Next
Amazon EMR: Big Data Processing with Hadoop and Spark