AXV

Ma’lumot formatlari: Parquet va Columnar saqlash

Katta ma'lumotlar arxitekturasida ustunli saqlash, Snappy siqish va Pushdown optimizatsiyalari

10-sinf BI va Machine Learning 2-hafta · 4-dars

Bugungi dars rejasi

Row vs Columnar

Satrli va ustunli saqlash usullarining tub mohiyati va analitikadagi (OLAP) ustunligi.

Parquet anatomiyasi

Row Groups, Column Chunks, Pages va nima uchun Metadata fayl oxirida joylashishi.

Pushdown & Siqish

Projection & Predicate pushdown, Snappy siqish algoritmi va CSV bilan tezlik poygasi.

01

Row-based vs Columnar saqlash

Diskda ma'lumotlarni qanday joylashtirish tahlil tezligini belgilaydi

Satrli (Row) va Ustunli (Columnar) farqi

Satrli (CSV, JSON, OLTP)

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!

Ustunli (Parquet, OLAP)

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!

Vizual taqqoslash: Diskdagi joylashuv

Satrli saqlash (CSV / Row-based) Har bir qator ketma-ket yoziladi: Qator 1: [ID: 1 | Ism: Ali | Ball: 85 | Shahar: Toshkent] Qator 2: [ID: 2 | Ism: Vali | Ball: 92 | Shahar: Samarqand] Qator 3: [ID: 3 | Ism: G'ani | Ball: 78 | Shahar: Buxoro] Faqat "Ball" kerak bo'lsa ham butun fayl o'qiladi Ustunli saqlash (Parquet / Columnar) Har bir ustun alohida saqlanadi: ID 1, 2, 3... Ism Ali, Vali... Ball 85, 92... Shahar Toshkent... Diskdan faqat "Ball" ustuni bloki o'qiladi!

Nega OLAP uchun ustunli format muhim?

0
Disk hajmi tejaladi
0
Tezroq analitik so'rovlar
0
Kamroq disk I/O yuklamasi

Bulutli xizmatlar (BigQuery, Athena, Snowflake) o'qilgan ma'lumot hajmiga qarab pul oladi. Parquet bilan xarajatlar bir necha barobar arzonlashadi!

02

Parquet faylining ichki tuzilishi

Header, Row Groups, Column Chunks va sirli Footer Metadatasi

Parquet fayl anatomiyasi

Header: "PAR1" (4 baytlik sehrli belgi) Row Group 1 (128 MB – 512 MB satrlar to'plami) Column Chunk 1 (id) Data Pages [Snappy siqilgan] Column Chunk 2 (ism) Data Pages [Snappy siqilgan] Column Chunk 3 (baho) Data Pages [Snappy siqilgan] Row Group 2, Row Group 3... (Keyingi bloklar) File Metadata (Footer): Schema + Min/Max statistikalar + Row Group offsetlari Oxirgi 4 bayt: yana "PAR1". So'rov kelganda avval Footer o'qiladi!

Nega Metadata fayl oxirida (Footer) turadi?

Streaming rejimida yozish

Katta hajmdagi ma'lumotlar oqim bilan yozilayotganda, nechta qator yozilgani va har bir ustunning Min/Max qiymatlari faqat yozuv tugagandagina ma'lum bo'ladi.

Single-pass yozish samarasi

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.

03

Pushdown va Siqish mexanizmlari

Projection pushdown, Predicate pushdown va Snappy algoritmi

Projection va Predicate Pushdown

Projection Pushdown

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'])

Predicate Pushdown

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

Snappy vs Gzip siqish

Snappy (Standart)

  • O'ta yuqori ochish (dekompressiya) tezligi
  • CPU resursini deyarli sarflamaydi
  • Parquet'da standart tanlov
  • Faylni 3–4 barobarga siqadi

Gzip (Arxivlash)

  • Maksimal darajada kichik fayl hajmi
  • Faylni 5–7 barobargacha siqadi
  • Ochishda ko'proq CPU vaqtini oladi
  • Uzoq muddatli sovuq arxivlar uchun mos
04

Amaliyot: CSV vs Parquet poygasi

Python va Pandas yordamida konvertatsiya va tezlik benchmarki

CSV dan Parquet yaratish (Python)

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!")

Benchmark: Hajm va Tezlik tahlili

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")

Interaktiv terminlar: Bosing va ko'ring

Column Chunk nima?

Bosing va javobni oching

Bitta Row Group ichidagi aniq bitta ustunning ma'lumotlar bloki. Har bir Column Chunk alohida siqiladi.

PAR1 nima?

Bosing va javobni oching

Parquet faylining eng boshidagi va eng oxiridagi 4 baytlik sehrli belgi (magic bytes). U fayl butunligini tasdiqlaydi.

Bilimingizni sinab ko'ring

Nima uchun Parquet faylida `columns=['ism']` berilganda I/O tezligi CSV'ga nisbatan keskin oshadi?

To'g'ri! Projection pushdown orqali Parquet kerak bo'lmagan ustunlarni diskdan o'qimaydi.

Bosqichma-bosqich: Data Lake'da Parquet o'rni

1-qadam: Raw CSV/JSON (Bronze)

Tashqi API yoki manbalardan kelgan xom ma'lumotlar asl holatida saqlanadi.

2-qadam: Profiling & Tozalash

Dublikatlar olib tashlanadi, encoding tuzatiladi, tiplar tekshiriladi.

3-qadam: Parquet konvertatsiya (Silver)

Tozalangan ma'lumotlar Snappy bilan siqilib, tezkor analitika uchun Parquet qilib saqlanadi.

Amaliy topshiriq: 3 daraja

1-daraja: Oson

10 000 qatorlik jadval yaratib, uni `index=False` bilan Parquet qilib saqlang va qayta o'qing.

10 daqiqa

2-daraja: O'rta

CSV va Parquet hajmlarini `os.path.getsize` orqali taqqoslab, tejalgan foizni chiqaring.

15 daqiqa

3-daraja: Qiyin

`columns` parametri bilan faqat 2 ustunni o'qish vaqti va to'liq o'qish vaqtini taqqoslang.

20 daqiqa

Dars xulosasi

  • Parquet — zamonaviy Big Data va BI arxitekturasining asosiy ustunli saqlash formati.
  • Columnar arxitektura analitik so'rovlarda (OLAP) ortiqcha ustunlarni o'qimaslik orqali tezlikni bir necha barobar oshiradi.
  • Projection & Predicate Pushdown disk I/O operatsiyalarini va bulut xarajatlarini keskin kamaytiradi.
  • Snappy siqish tezlik va hajm o'rtasidagi eng maqbul muvozanatni ta'minlaydi.
  • Keyingi dars: Apache Avro formati va barcha formatlarning chuqur qiyosiy tahlili!