Katta ma'lumotlar arxitekturasida ustunli saqlash, Snappy siqish va Pushdown optimizatsiyalari
10-sinf BI va Machine Learning 2-hafta · 4-darsSatrli va ustunli saqlash usullarining tub mohiyati va analitikadagi (OLAP) ustunligi.
Row Groups, Column Chunks, Pages va nima uchun Metadata fayl oxirida joylashishi.
Projection & Predicate pushdown, Snappy siqish algoritmi va CSV bilan tezlik poygasi.
Diskda ma'lumotlarni qanday joylashtirish tahlil tezligini belgilaydi
Ma'lumotlar qator-baqator yoziladi. Bitta foydalanuvchining barcha ma'lumotlarini o'qish yoki yangi qator qo'shish uchun ideal.
100 ta ustundan 1 tasi kerak bo'lsa ham, barcha 100 ta ustun diskdan to'liq o'qiladi!
Har bir ustun alohida yaxlit blok qilib saqlanadi. Faqat kerakli ustunlar o'qiladi, ortiqcha disk I/O sarflanmaydi.
O'xshash ma'lumotlar yonma-yon turgani sababli siqilish darajasi 3–5 barobar yuqori!
Bulutli xizmatlar (BigQuery, Athena, Snowflake) o'qilgan ma'lumot hajmiga qarab pul oladi. Parquet bilan xarajatlar bir necha barobar arzonlashadi!
Header, Row Groups, Column Chunks va sirli Footer Metadatasi
Katta hajmdagi ma'lumotlar oqim bilan yozilayotganda, nechta qator yozilgani va har bir ustunning Min/Max qiymatlari faqat yozuv tugagandagina ma'lum bo'ladi.
Agar metadata fayl boshida bo'lganida, butun faylni qaytadan ochib, boshiga qaytib yozish kerak bo'lardi. Footer tufayli fayl bir urinishda (single-pass) yozib tugatiladi.
Projection pushdown, Predicate pushdown va Snappy algoritmi
So'rovda yozilgan ustunlarni disk darajasida aniqlash. Masalan, 100 ta ustundan faqat 3 tasi tanlansa, 97 ta ustun diskdan hatto o'qilmaydi.
# Faqat 2 ustun yuklanadi:
df = pd.read_parquet('f.parquet',
columns=['ism', 'ball'])
WHERE filtri shartini Row Group metadatasiga solishtirish. Agar yil == 2024 bo'lsa va 1-guruhda yillar 2020-2022 bo'lsa, butun guruh o'qilmaydi!
# Row Group Min/Max orqali
# keraksiz bloklar tashlanadi
Python va Pandas yordamida konvertatsiya va tezlik benchmarki
import pandas as pd
import os
# 1. CSV ma'lumotlarni o'qiymiz
df = pd.read_csv('data/raw/maktab_baholar.csv')
print("Qatorlar soni:", len(df))
# 2. Parquet formatga Snappy siqish bilan saqlaymiz
os.makedirs('data/silver', exist_ok=True)
df.to_parquet('data/silver/maktab.parquet', compression='snappy', index=False)
# 3. Parquet faylni xotiraga o'qiymiz
df_parq = pd.read_parquet('data/silver/maktab.parquet')
print("Parquet muvaffaqiyatli o'qildi!")
import os, time
# Hajmlarni o'lchash
csv_size = os.path.getsize('data/raw/maktab_baholar.csv') / (1024*1024)
parq_size = os.path.getsize('data/silver/maktab.parquet') / (1024*1024)
print(f"CSV: {csv_size:.2f} MB | Parquet: {parq_size:.2f} MB")
# To'liq o'qish vaqti
t0 = time.time(); pd.read_csv('data/raw/maktab_baholar.csv')
print(f"CSV o'qish: {time.time()-t0:.3f} s")
t0 = time.time(); pd.read_parquet('data/silver/maktab.parquet')
print(f"Parquet o'qish: {time.time()-t0:.3f} s")
# Selektiv ustun o'qish (Projection Pushdown)
t0 = time.time()
pd.read_parquet('data/silver/maktab.parquet', columns=['fan', 'baho'])
print(f"Parquet 2 ustun: {time.time()-t0:.3f} s")
Bosing va javobni oching
Bitta Row Group ichidagi aniq bitta ustunning ma'lumotlar bloki. Har bir Column Chunk alohida siqiladi.
Bosing va javobni oching
Parquet faylining eng boshidagi va eng oxiridagi 4 baytlik sehrli belgi (magic bytes). U fayl butunligini tasdiqlaydi.
Nima uchun Parquet faylida `columns=['ism']` berilganda I/O tezligi CSV'ga nisbatan keskin oshadi?
Tashqi API yoki manbalardan kelgan xom ma'lumotlar asl holatida saqlanadi.
Dublikatlar olib tashlanadi, encoding tuzatiladi, tiplar tekshiriladi.
Tozalangan ma'lumotlar Snappy bilan siqilib, tezkor analitika uchun Parquet qilib saqlanadi.
10 000 qatorlik jadval yaratib, uni `index=False` bilan Parquet qilib saqlang va qayta o'qing.
10 daqiqaCSV va Parquet hajmlarini `os.path.getsize` orqali taqqoslab, tejalgan foizni chiqaring.
15 daqiqa`columns` parametri bilan faqat 2 ustunni o'qish vaqti va to'liq o'qish vaqtini taqqoslang.
20 daqiqa