AWS Data Engineering Bootcamp شرح ببساطة (مع مخططات وكود حقيقي)
AWS Data Engineering Bootcamp : الأساسيات في مقال واحد — كود حقيقي، مخططات وخطوات عملية، مقتطفات من دورة مكونة من 17 درسًا.
دليل مباشر إلى الهدف: AWS Data Engineering Bootcamp مفكك مع مخططات ورسوم بيانية، أمثلة عملية وأوامر مجربة. كل شيء من دورة منظمة من 5 فصول — إليك الأفضل منها.
- مقدمة في هندسة بيانات AWS
- التقسيم والتجميع
- Athena وGlue قيد التنفيذ
- الكاردينالية والتحسين المتقدم
- معمل Athena الموجه
الفصل 02 – الدرس 3: التحسين بالتجميع والتقسيم في Athena
التحسين بالتجميع في Athena
لماذا التجميع؟
يقوم التجميع (bucketing) بتوزيع البيانات على عدة ملفات وفق مفتاح تجزئة. يحسن الأداء بشكل كبير عند العمل على أعمدة ذات كاردينالية عالية.
تقليل المسح
يستهدف Athena فقط الحاويات (buckets) المطلوبة أثناء الاستعلام.
تحسين الربط
عندما تكون جدولان مجمّعين على نفس المفتاح، ينفذ Athena عمليات ربط سريعة جداً.
الكاردينالية العالية
مثالي لـ user_id، transaction_id، device_id.
مثال عملي: معاملات التجارة الإلكترونية المجمّعة
-- الخطوة 1: إعداد التجميع أثناء إنشاء الجدول
-- استبدل user_id بعمودك ذي الكاردينالية العالية
CLUSTERED BY (user_id) INTO 8 BUCKETS
-- مثال كامل باستخدام CTAS (Create Table As Select)
CREATE TABLE taxidata.transactions_bucketized
WITH (
format = 'PARQUET',
external_location = 's3://mon-bucket/transactions-bucketized/',
bucketed_by = ARRAY['user_id'],
bucket_count = 8
) AS
SELECT *
FROM taxidata.transactions_source;s3://mon-bucket/transactions-bucketized/ ├── 000000_0.parquet ├── 000001_0.parquet ├── ... └── 000007_0.parquet
خطوات إعداد التجميع
التحسين بالتقسيم في Athena
هيكل الأقسام في S3
ينظم التقسيم البيانات في مجلدات منفصلة داخل S3 وفق قيم عمود ذي كاردينالية منخفضة:
# هيكل الأقسام في S3 (تنسيق Hive)
s3://taxi-datalake/yellow/
├── year=2015/month=01/
│ └── data.parquet
├── year=2015/month=02/
│ └── data.parquet
├── year=2016/month=01/
│ └── data.parquet
└── year=2017/month=01/
└── data.parquetإنشاء جدول مقسم عبر CTAS
-- CTAS (Create Table As Select) مع التقسيم
-- تحويل CSV → Parquet مع التقسيم
CREATE TABLE taxidata.yellow_partitioned
WITH (
format = 'PARQUET',
external_location = 's3://taxi-datalake/yellow-partitioned/',
partitioned_by = ARRAY['year', 'month']
) AS
SELECT
vendor, pickup, dropoff, count,
distance, ratecode, storeflag, pulocid, dolocid,
paytype, fare, extra, mta_tax, tip, tolls, surcharge, total,
YEAR(pickup) AS year,
MONTH(pickup) AS month
FROM taxidata.yellow;year، month) في آخر عبارة SELECT وفي مصفوفة partitioned_by.اكتشاف الأقسام
-- بعد إضافة البيانات، اكتشف الأقسام الجديدة MSCK REPAIR TABLE taxidata.yellow_partitioned; -- إضافة قسم محدد يدوياً ALTER TABLE taxidata.yellow_partitioned ADD PARTITION (year='2017', month='02') LOCATION 's3://taxi-datalake/yellow-partitioned/year=2017/month=02/';
استعلامات محسنة باستخدام التقسيم
-- استعلام بدون تقسيم: مسح كامل الجدول SELECT COUNT(*), SUM(fare) AS total_fares FROM taxidata.yellow WHERE YEAR(pickup) = 2017 AND MONTH(pickup) = 1; -- → Scan : 100% des données (ex: 1 TB) -- استعلام مع التقسيم: مسح القسم المعني فقط SELECT COUNT(*), SUM(fare) AS total_fares FROM taxidata.yellow_partitioned WHERE year = 2017 AND month = 1; -- → Scan : ~1/36 des données (si 3 ans × 12 mois) -- → Réduction de ~97% des données scannées !
التركيبة المثلى: التقسيم + التجميع
الفصل 02 – الدرس 2: إعداد Athena وإنشاء قاعدة بيانات Glue
الخطوة 1 — إعداد بيئة Athena
# بديل: الإعداد عبر AWS CLI
aws athena update-work-group \
--work-group primary \
--configuration-updates "ResultConfigurationUpdates={OutputLocation=s3://mon-bucket-athena-results/}"الخطوة 2 — إنشاء قاعدة بيانات Glue
في محرر Athena، نفذ:
-- إنشاء قاعدة بيانات taxidata في AWS Glue Data Catalog CREATE DATABASE taxidata;
taxidata في AWS Glue Data Catalog. يمكنك رؤيتها في وحدة تحكم Glue ضمن "Databases".# التحقق من الإنشاء عبر AWS CLI aws glue get-database --name taxidata # سرد جميع قواعد البيانات aws glue get-databases
الخطوة 3 — تعريف مخطط الجدول (مجموعة بيانات سيارات الأجرة في نيويورك)
ننشئ الجدول الخارجي yellow على بيانات سيارات الأجرة في نيويورك المخزنة في S3:
-- إنشاء الجدول الخارجي yellow على بيانات S3
CREATE EXTERNAL TABLE IF NOT EXISTS taxidata.yellow (
`vendor` string,
`pickup` timestamp,
`dropoff` timestamp,
`count` int,
`distance` int,
`ratecode` string,
`storeflag` string,
`pulocid` string,
`dolocid` string,
`paytype` string,
`fare` decimal,
`extra` decimal,
`mta_tax` decimal,
`tip` decimal,
`tolls` decimal,
`surcharge` decimal,
`total` decimal
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = ',',
'field.delim' = ','
) LOCATION 's3://aws-tc-largeobjects/CUR-TF-200-ACDSCI-1/Lab2/yellow/'
TBLPROPERTIES ('has_encrypted_data'='false');CREATE EXTERNAL TABLE— يشير الجدول إلى S3، Athena لا تنسخ البياناتLazySimpleSerDe— مسلسل/مفكك تسلسل لملفات CSV المفصولةfield.delim = ','— الحقول مفصولة بفواصلLOCATION— مسار S3 الذي يحتوي ملفات البياناتhas_encrypted_data='false'— البيانات غير مشفرة
الخطوة 4 — معاينة البيانات
-- معاينة أول 10 صفوف SELECT * FROM taxidata.yellow LIMIT 10; -- عد إجمالي عدد الرحلات SELECT COUNT(*) AS total_trajets FROM taxidata.yellow; -- التحقق من أنواع الدفع المتاحة SELECT DISTINCT paytype, COUNT(*) AS nb_trajets FROM taxidata.yellow GROUP BY paytype ORDER BY nb_trajets DESC;
الخطوة 5 — إنشاء جدول محسن (يناير 2017)
-- إنشاء جدول لبيانات يناير 2017 فقط
-- أسرع للاختبار والتحقق
CREATE EXTERNAL TABLE IF NOT EXISTS taxidata.jan (
`vendor` string,
`pickup` timestamp,
`dropoff` timestamp,
`count` int,
`distance` int,
`ratecode` string,
`storeflag` string,
`pulocid` string,
`dolocid` string,
`paytype` string,
`fare` decimal,
`extra` decimal,
`mta_tax` decimal,
`tip` decimal,
`tolls` decimal,
`surcharge` decimal,
`total` decimal
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = ',',
'field.delim' = ','
) LOCATION 's3://aws-tc-largeobjects/CUR-TF-200-ACDSCI-1/Lab2/January2017/'
TBLPROPERTIES ('has_encrypted_data'='false');الفصل 03 – الدرس 1: طرق عرض SQL، الاستعلامات المسماة وAWS CloudFormation
طرق عرض SQL في Athena
طريقة عرض SQL هي استعلام محفوظ يمكن استخدامه كجدول. لا تخزن بيانات — تنفذ الاستعلام الأساسي في كل استدعاء.
مثال 1: طريقة عرض الرحلات ببطاقة الائتمان
-- إنشاء طريقة عرض للمدفوعات ببطاقة الائتمان
-- paytype = '1' تعني الدفع ببطاقة
CREATE VIEW taxidata.cctrips AS
SELECT
vendor,
SUM(fare) AS total_fares_cc,
COUNT(*) AS nb_trajets_cc,
AVG(fare) AS tarif_moyen_cc
FROM taxidata.yellow
WHERE paytype = '1'
GROUP BY vendor;
-- استخدام طريقة العرض
SELECT * FROM taxidata.cctrips;مثال 2: طريقة عرض الرحلات النقدية
-- إنشاء طريقة عرض للمدفوعات النقدية
-- paytype = '2' تعني الدفع نقداً
CREATE VIEW taxidata.cashtrips AS
SELECT
vendor,
SUM(fare) AS total_fares_cash,
COUNT(*) AS nb_trajets_cash,
AVG(fare) AS tarif_moyen_cash
FROM taxidata.yellow
WHERE paytype = '2'
GROUP BY vendor;
-- استخدام طريقة العرض
SELECT * FROM taxidata.cashtrips;مثال 3: طريقة عرض المقارنة باستخدام CTE (WITH)
-- طريقة عرض مقارنة تجمع بين بطاقة الائتمان والنقد
-- استخدام CTE (Common Table Expressions) مع WITH
CREATE VIEW taxidata.comparepay AS
WITH
cc AS (
SELECT
vendor,
SUM(fare) AS cctotal,
COUNT(*) AS nb_cc
FROM taxidata.yellow
WHERE paytype = '1'
GROUP BY vendor
),
cash AS (
SELECT
vendor,
SUM(fare) AS cashtotal,
COUNT(*) AS nb_cash
FROM taxidata.yellow
WHERE paytype = '2'
GROUP BY vendor
)
SELECT
cc.vendor,
cc.cctotal,
cc.nb_cc,
cash.cashtotal,
cash.nb_cash,
ROUND(cc.cctotal / cash.cashtotal, 2) AS ratio_cc_cash
FROM cc
JOIN cash ON cc.vendor = cash.vendor;
-- استعلام على طريقة العرض
SELECT * FROM taxidata.comparepay ORDER BY ratio_cc_cash DESC;إدارة طرق العرض
-- سرد طرق العرض المتاحة
SHOW VIEWS IN taxidata;
-- عرض تعريف طريقة عرض
SHOW CREATE VIEW taxidata.comparepay;
-- استبدال طريقة عرض موجودة
CREATE OR REPLACE VIEW taxidata.cctrips AS
SELECT
vendor,
SUM(fare) AS total_fares_cc,
COUNT(*) AS nb_trajets_cc
FROM taxidata.yellow
WHERE paytype = '1'
GROUP BY vendor;
-- حذف طريقة عرض
DROP VIEW taxidata.cashtrips;الاستعلامات المسماة في Athena
تتيح الاستعلامات المسماة (Named Queries) حفظ استعلامات SQL المستخدمة بشكل متكرر مباشرة في Athena. تتم مشاركتها داخل حساب AWS الخاص بك.
المزايا
القيود
الأتمتة باستخدام AWS CloudFormation
بدلاً من إنشاء الاستعلامات المسماة يدوياً عبر الوحدة، يمكنك نشرها كرمز باستخدام AWS CloudFormation.
قالب CloudFormation لاستعلام مسمى
أنشئ ملفاً باسم athenaquery.cf.yml:
AWSTemplateFormatVersion: 2010-09-09
Description: "Requête Athena nommée pour l'analyse des taxis NYC"
Resources:
AthenaNamedQuery:
Type: AWS::Athena::NamedQuery
Properties:
Database: "taxidata"
Description: "Sélection des trajets dont le montant dépasse 100 $"
Name: "FaresOver100DollarsUS"
QueryString: >
SELECT
distance,
paytype,
fare,
tip,
tolls,
surcharge,
total
FROM yellow
WHERE total >= 100.0
ORDER BY total DESC
Outputs:
AthenaNamedQuery:
Description: "L'ID de la requête nommée Athena créée"
Value: !Ref AthenaNamedQueryنشر قالب CloudFormation عبر AWS CLI
# الخطوة 1: التحقق من صحة القالب قبل النشر
aws cloudformation validate-template \
--template-body file://athenaquery.cf.yml
# الخطوة 2: إنشاء stack CloudFormation
aws cloudformation create-stack \
--stack-name mon-athena-stack \
--template-body file://athenaquery.cf.yml \
--capabilities CAPABILITY_IAM
# الخطوة 3: التحقق من حالة الإنشاء
aws cloudformation describe-stacks \
--stack-name mon-athena-stack \
--query 'Stacks[0].StackStatus'
# الخطوة 4: سرد الاستعلامات المسماة المنشأة
aws athena list-named-queries \
--work-group primary
# الخطوة 5: الحصول على تفاصيل استعلام مسمى
aws athena get-named-query \
--named-query-id "ID_RETOURNÉ_PAR_LIST"يغطي هذا المقال المقتطفات الأكثر فائدة — الدورة الكاملة AWS Data Engineering Bootcamp (5 فصول، 17 درساً، تمارين محلولة ومشروع نهائي) تأخذك إلى النهاية.
./acceder-au-cours-complet cours gratuit : Maîtriser Claude Codeالأسئلة الشائعة
كم من الوقت يستغرق تعلم AWS Data Engineering Bootcamp؟
هل هناك متطلبات سابقة؟
من أين أبدأ عملياً؟
📬 هل تريد تلقي هذا النوع من الأدلة كل أسبوع؟ اشترك مجاناً — كود حقيقي، بدون كلام زائد.