يُخزَّن الكثير من بيانات العالم في حاويات Amazon S3. في هذا الدليل، سنتعلّم كيفية الاستعلام عن هذه البيانات باستخدام chDB.
الإعداد
لنبدأ أولاً بإنشاء بيئة افتراضية:
python -m venv .venv
source .venv/bin/activateوالآن سنثبّت chDB. تأكّد من أن الإصدار لديك هو 2.0.2 أو أحدث:
pip install "chdb>=2.0.2"والآن سنثبّت IPython:
pip install ipythonسنستخدم ipython لتشغيل الأوامر في بقية هذا الدليل، ويمكنك تشغيله بتنفيذ:
ipythonيمكنك أيضًا استخدام الكود في برنامج نصي بلغة Python أو في دفتر Jupyter المفضل لديك.
سرد الملفات في حاوية S3
لنبدأ بسرد جميع الملفات في حاوية S3 التي تحتوي على مراجعات Amazon.
للقيام بذلك، يمكننا استخدام دالة الجدول s3 وتمرير path إلى ملف أو محرف بدل لمجموعة من الملفات.
سنستخدم أيضًا تنسيق الإدخال One حتى لا يُحلَّل الملف؛ وبدلًا من ذلك، يُعاد صف واحد لكل ملف، ويمكننا الوصول إلى الملف عبر العمود الافتراضي _file وإلى المسار عبر العمود الافتراضي _path.
import chdb
chdb.query("""
SELECT
_file,
_path
FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet', One)
SETTINGS output_format_pretty_row_numbers=0
""", 'PrettyCompact')┌─_file───────────────────────────────┬─_path─────────────────────────────────────────────────────────────────────┐
│ amazon_reviews_2010.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2010.snappy.parquet │
│ amazon_reviews_1990s.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_1990s.snappy.parquet │
│ amazon_reviews_2013.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2013.snappy.parquet │
│ amazon_reviews_2015.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2015.snappy.parquet │
│ amazon_reviews_2014.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2014.snappy.parquet │
│ amazon_reviews_2012.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2012.snappy.parquet │
│ amazon_reviews_2000s.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2000s.snappy.parquet │
│ amazon_reviews_2011.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2011.snappy.parquet │
└─────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────┘لا تحتوي هذه الحاوية إلا على ملفات Parquet.
الاستعلام عن الملفات في حاوية S3
بعد ذلك، لنتعلّم كيفية الاستعلام عن هذه الملفات. إذا أردنا حساب عدد الصفوف في كل ملف من هذه الملفات، يمكننا تشغيل الاستعلام التالي:
chdb.query("""
SELECT
_file,
count() AS count,
formatReadableQuantity(count) AS readableCount
FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet')
GROUP BY ALL
SETTINGS output_format_pretty_row_numbers=0
""", 'PrettyCompact')┌─_file───────────────────────────────┬────count─┬─readableCount───┐
│ amazon_reviews_2013.snappy.parquet │ 28034255 │ 28.03 million │
│ amazon_reviews_1990s.snappy.parquet │ 639532 │ 639.53 thousand │
│ amazon_reviews_2011.snappy.parquet │ 6112495 │ 6.11 million │
│ amazon_reviews_2015.snappy.parquet │ 41905631 │ 41.91 million │
│ amazon_reviews_2012.snappy.parquet │ 11541011 │ 11.54 million │
│ amazon_reviews_2000s.snappy.parquet │ 14728295 │ 14.73 million │
│ amazon_reviews_2014.snappy.parquet │ 44127569 │ 44.13 million │
│ amazon_reviews_2010.snappy.parquet │ 3868472 │ 3.87 million │
└─────────────────────────────────────┴──────────┴─────────────────┘يمكننا أيضًا تمرير عنوان URI عبر HTTP لحاوية S3، وسنحصل على النتائج نفسها:
chdb.query("""
SELECT
_file,
count() AS count,
formatReadableQuantity(count) AS readableCount
FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/*.parquet')
GROUP BY ALL
SETTINGS output_format_pretty_row_numbers=0
""", 'PrettyCompact')دعنا نلقِ نظرة على بنية ملفات Parquet هذه باستخدام عبارة DESCRIBE:
chdb.query("""
DESCRIBE s3('s3://datasets-documentation/amazon_reviews/*.parquet')
SETTINGS describe_compact_output=1
""", 'PrettyCompact') ┌─name──────────────┬─type─────────────┐
1. │ review_date │ Nullable(UInt16) │
2. │ marketplace │ Nullable(String) │
3. │ customer_id │ Nullable(UInt64) │
4. │ review_id │ Nullable(String) │
5. │ product_id │ Nullable(String) │
6. │ product_parent │ Nullable(UInt64) │
7. │ product_title │ Nullable(String) │
8. │ product_category │ Nullable(String) │
9. │ star_rating │ Nullable(UInt8) │
10. │ helpful_votes │ Nullable(UInt32) │
11. │ total_votes │ Nullable(UInt32) │
12. │ vine │ Nullable(Bool) │
13. │ verified_purchase │ Nullable(Bool) │
14. │ review_headline │ Nullable(String) │
15. │ review_body │ Nullable(String) │
└───────────────────┴──────────────────┘لنحسب الآن أبرز فئات المنتجات بناءً على عدد المراجعات، وكذلك متوسط التقييم بالنجوم:
chdb.query("""
SELECT product_category, count() AS reviews, round(avg(star_rating), 2) as avg
FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet')
GROUP BY ALL
LIMIT 10
""", 'PrettyCompact') ┌─product_category─┬──reviews─┬──avg─┐
1. │ Toys │ 4864056 │ 4.21 │
2. │ Apparel │ 5906085 │ 4.11 │
3. │ Luggage │ 348644 │ 4.22 │
4. │ Kitchen │ 4880297 │ 4.21 │
5. │ Books │ 19530930 │ 4.34 │
6. │ Outdoors │ 2302327 │ 4.24 │
7. │ Video │ 380596 │ 4.19 │
8. │ Grocery │ 2402365 │ 4.31 │
9. │ Shoes │ 4366757 │ 4.24 │
10. │ Jewelry │ 1767667 │ 4.14 │
└──────────────────┴──────────┴──────┘الاستعلام عن الملفات في حاوية S3 خاصة
إذا كنا نستعلم عن ملفات في حاوية S3 خاصة، فسنحتاج إلى تمرير مفتاح وصول ومفتاح سري.
يمكننا تمرير بيانات الاعتماد هذه إلى دالة الجدول s3:
chdb.query("""
SELECT product_category, count() AS reviews, round(avg(star_rating), 2) as avg
FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet', 'access-key', 'secret')
GROUP BY ALL
LIMIT 10
""", 'PrettyCompact')ومن البدائل استخدام المجموعات المُسمّاة، لكن هذا النهج غير مدعوم بعد في chDB.