Delta ko'liga sho'ng'ish: sxemani qo'llash va evolyutsiya

Hey Xabr! E'tiboringizga maqolaning tarjimasini taqdim etaman "Delta ko'liga sho'ng'ish: sxemani qo'llash va evolyutsiya" mualliflar Burak Yavuz, Brenner Xaynts va Denni Li, kurs boshlanishini kutgan holda tayyorlangan Ma'lumotlar muhandisi OTUSdan.

Delta ko'liga sho'ng'ish: sxemani qo'llash va evolyutsiya

Ma'lumotlar, bizning tajribamiz kabi, doimo to'planib, rivojlanib boradi. Buni davom ettirish uchun bizning dunyoning aqliy modellarimiz yangi ma'lumotlarga moslashishi kerak, ularning ba'zilari yangi o'lchamlarni o'z ichiga oladi - biz ilgari hech qanday tasavvurga ega bo'lmagan narsalarni kuzatishning yangi usullari. Ushbu aqliy modellar yangi ma'lumotlarni qanday tasniflash va qayta ishlashimizni aniqlaydigan jadval sxemalaridan unchalik farq qilmaydi.

Bu bizni sxemani boshqarish masalasiga olib keladi. Vaqt o'tishi bilan biznes muammolari va talablari o'zgargani uchun ma'lumotlaringiz tuzilishi ham o'zgaradi. Delta ko'li ma'lumotlar o'zgarishi bilan yangi o'lchovlarni kiritishni osonlashtiradi. Foydalanuvchilar jadval sxemalarini boshqarish uchun oddiy semantikadan foydalanishlari mumkin. Bu vositalar foydalanuvchilarni oʻz jadvallarini xatoliklar yoki keraksiz maʼlumotlar bilan beixtiyor ifloslantirishdan himoya qiluvchi Schema Enforcement va qimmatli maʼlumotlarning yangi ustunlarini tegishli joylarga avtomatik ravishda qoʻshish imkonini beruvchi Schema Evolutionni oʻz ichiga oladi. Ushbu maqolada biz ushbu vositalardan foydalanishga chuqurroq kirib boramiz.

Jadval sxemalarini tushunish

Apache Spark-dagi har bir DataFrame ma'lumotlar turlari, ustunlar va metadata kabi ma'lumotlar shaklini belgilaydigan sxemani o'z ichiga oladi. Delta Lake bilan jadval sxemasi tranzaktsiyalar jurnalida JSON formatida saqlanadi.

Sxemani amalga oshirish nima?

Sxemani tekshirish, shuningdek, Sxemani tekshirish sifatida ham tanilgan, Delta ko'lidagi xavfsizlik mexanizmi bo'lib, jadval sxemasiga mos kelmaydigan yozuvlarni rad etish orqali ma'lumotlar sifatini ta'minlaydi. Mashhur faqat bron qilish mumkin bo'lgan restoranning old stolidagi styuardessa singari, u jadvalga kiritilgan ma'lumotlarning har bir ustuni kutilgan ustunlarning tegishli ro'yxatida (boshqacha qilib aytganda, ularning har biri uchun "zahira" mavjudligini yoki yo'qligini tekshiradi. ) va ro'yxatda bo'lmagan ustunli yozuvlarni rad etadi.

Sxemani qo'llash qanday ishlaydi?

Delta Lake sxemani yozishda tekshirishdan foydalanadi, ya'ni jadvalga kiritilgan barcha yangi yozuvlar yozish vaqtida maqsadli jadval sxemasiga muvofiqligi tekshiriladi. Agar sxema mos kelmasa, Delta Lake tranzaksiyani butunlay bekor qiladi (hech qanday ma'lumot yozilmaydi) va foydalanuvchini nomuvofiqlik haqida xabardor qilish uchun istisno qiladi.
Delta ko'li yozuvning jadvalga mos kelishini aniqlash uchun quyidagi qoidalardan foydalanadi. Yoziladigan DataFrame:

  • maqsadli jadval sxemasida bo'lmagan qo'shimcha ustunlarni o'z ichiga olmaydi. Aksincha, agar kiruvchi ma'lumotlar jadvaldagi barcha ustunlarni o'z ichiga olmasa, hamma narsa yaxshi - bu ustunlarga oddiygina null qiymatlar beriladi.
  • maqsadli jadvaldagi ustunlar ma'lumotlar turlaridan farqli ustun ma'lumotlar turlariga ega bo'lishi mumkin emas. Maqsadli jadval ustuni StringType ma'lumotlarini o'z ichiga olsa, lekin DataFrame'dagi tegishli ustun IntegerType ma'lumotlarini o'z ichiga olsa, sxemani qo'llash istisno qiladi va yozish jarayonini amalga oshirishni oldini oladi.
  • faqat har bir holatda farq qiluvchi ustun nomlarini o'z ichiga olmaydi. Bu shuni anglatadiki, siz bitta jadvalda "Foo" va "foo" nomli ustunlarga ega bo'lolmaysiz. Spark katta-kichik va katta-kichik harflarni sezgir bo'lmagan (standart) rejimida ishlatilishi mumkin bo'lsa-da, Delta Lake katta harflarni saqlaydi, lekin sxemani saqlashda sezgir emas. Ustun ma'lumotlarini saqlash va qaytarishda parket katta-kichik harflarga sezgir. Mumkin bo'lgan xatolar, ma'lumotlarning buzilishi yoki ma'lumotlar yo'qolishining oldini olish uchun (biz Databricks'da shaxsan boshdan kechirgan narsa) biz ushbu cheklovni qo'shishga qaror qildik.

Buni ko'rsatish uchun, keling, Delta ko'li jadvaliga yangi yaratilgan ustunlarni qo'shishga harakat qilganimizda, quyidagi kodda nima sodir bo'lishini ko'rib chiqaylik, ularni qabul qilish uchun hali sozlanmagan.

# Сгенерируем DataFrame ссуд, который мы добавим в нашу таблицу Delta Lake
loans = sql("""
            SELECT addr_state, CAST(rand(10)*count as bigint) AS count,
            CAST(rand(10) * 10000 * count AS double) AS amount
            FROM loan_by_state_delta
            """)

# Вывести исходную схему DataFrame
original_loans.printSchema()

root
  |-- addr_state: string (nullable = true)
  |-- count: integer (nullable = true)
 
# Вывести новую схему DataFrame
loans.printSchema()
 
root
  |-- addr_state: string (nullable = true)
  |-- count: integer (nullable = true)
  |-- amount: double (nullable = true) # new column
 
# Попытка добавить новый DataFrame (с новым столбцом) в существующую таблицу
loans.write.format("delta") 
           .mode("append") 
           .save(DELTALAKE_PATH)

Returns:

A schema mismatch detected when writing to the Delta table.
 
To enable schema migration, please set:
'.option("mergeSchema", "true")'
 
Table schema:
root
-- addr_state: string (nullable = true)
-- count: long (nullable = true)
 
Data schema:
root
-- addr_state: string (nullable = true)
-- count: long (nullable = true)
-- amount: double (nullable = true)
 
If Table ACLs are enabled, these options will be ignored. Please use the ALTER TABLE command for changing the schema.

Avtomatik ravishda yangi ustunlar qo'shish o'rniga, Delta Lake sxemani qo'yadi va yozishni to'xtatadi. Qaysi ustun (yoki ustunlar to'plami) nomuvofiqlikka sabab bo'layotganini aniqlashga yordam berish uchun Spark taqqoslash uchun ikkala sxemani stek izidan chiqaradi.

Sxemani qo'llashdan qanday foyda bor?

Sxemani qo'llash juda qattiq tekshiruv bo'lgani uchun u ishlab chiqarish yoki iste'molga tayyor bo'lgan toza, to'liq o'zgartirilgan ma'lumotlar to'plamiga darvozabon sifatida foydalanish uchun ajoyib vositadir. Odatda ma'lumotlarni bevosita uzatuvchi jadvallarga qo'llaniladi:

  • Mashinani o'rganish algoritmlari
  • BI boshqaruv paneli
  • Ma'lumotlarni tahlil qilish va vizualizatsiya vositalari
  • Yuqori darajada tuzilgan, kuchli terilgan semantik sxemalarni talab qiladigan har qanday ishlab chiqarish tizimi.

Ushbu yakuniy to'siq uchun o'z ma'lumotlarini tayyorlash uchun ko'plab foydalanuvchilar o'zlarining jadvallariga tuzilmani bosqichma-bosqich kiritadigan oddiy "ko'p tarmoqli" arxitekturadan foydalanadilar. Bu haqda ko'proq ma'lumot olish uchun siz maqolani ko'rishingiz mumkin Delta ko'li bilan ishlab chiqarish darajasida mashinani o'rganish.

Albatta, sxemani qo'llash quvur liniyasining istalgan joyida ishlatilishi mumkin, lekin esda tutingki, bu holda jadvalga oqim berish asabiylashishi mumkin, chunki, masalan, siz kiruvchi ma'lumotlarga boshqa ustun qo'shganingizni unutgansiz.

Ma'lumotlarni suyultirishning oldini olish

Hozircha siz hayron bo'layotgandirsiz, bu nima bilan bog'liq? Axir, ba'zida kutilmagan "sxema nomuvofiqligi" xatosi, ayniqsa, Delta ko'lida yangi bo'lsangiz, ish oqimingizda sizni buzishi mumkin. Nima uchun nima bo'lishidan qat'iy nazar DataFrame-ni yozishim uchun sxemani kerak bo'lganda o'zgartirishga ruxsat bermaslik kerak?

Qadimgi maqolda aytilganidek, "bir untsiya oldini olish bir funt davoga arziydi". Bir nuqtada, agar siz sxemani amalga oshirishga e'tibor bermasangiz, ma'lumotlar turlarining mosligi bilan bog'liq muammolar paydo bo'ladi - bir hil ko'rinadigan xom ma'lumotlar manbalarida chekka holatlar, buzilgan ustunlar, noto'g'ri shakllangan xaritalar yoki orzu qilish uchun boshqa qo'rqinchli narsalar bo'lishi mumkin. dahshatli tushlar. Eng yaxshi yondashuv - bu dushmanlarni darvoza oldida to'xtatish - sxemani qo'llash - va ular ishlab chiqarish kodingizning qorong'u chuqurligida yashirinishni boshlaganda emas, balki ular bilan yorug'likda kurashishdir.

Sxemani qo'llash sizga o'zgartirishni ma'qullamaguningizcha jadvalingiz sxemasi o'zgarmasligiga ishonch hosil qiladi. Bu yangi ustunlar shunchalik tez-tez qo'shilganda paydo bo'lishi mumkin bo'lgan ma'lumotlarning suyultirilishining oldini oladi, chunki ilgari qimmatli, siqilgan jadvallar ma'lumotlarning suv ostida qolishi sababli o'z ma'nosini va foydaliligini yo'qotadi. Sizni qasddan bo'lishga, yuqori standartlarni o'rnatishga va yuqori sifatni kutishga undagan holda, sxemani qo'llash to'liq mo'ljallangan narsani bajaradi - vijdonli va elektron jadvallaringizni toza saqlashga yordam beradi.

Agar ko'proq o'ylab ko'rsangiz, haqiqatan ham shunday deb qaror qilsangiz kerak yangi ustun qo'shing - muammo yo'q, quyida bir qatorli tuzatish mavjud. Yechim - sxemaning evolyutsiyasi!

Sxema evolyutsiyasi nima?

Sxema evolyutsiyasi foydalanuvchilarga vaqt o'tishi bilan o'zgarib turadigan ma'lumotlarga ko'ra joriy jadval sxemasini osongina o'zgartirishga imkon beruvchi xususiyatdir. Ko'pincha sxemani bir yoki bir nechta yangi ustunlarni kiritish uchun avtomatik ravishda moslashtirish uchun qo'shish yoki qayta yozish operatsiyasini bajarishda foydalaniladi.

Sxema evolyutsiyasi qanday ishlaydi?

Oldingi bo'limdagi misoldan so'ng, ishlab chiquvchilar sxemaning nomuvofiqligi sababli ilgari rad etilgan yangi ustunlarni qo'shish uchun sxema evolyutsiyasidan osongina foydalanishlari mumkin. Devren evolyutsiyasi qo'shish orqali faollashtiriladi .option('mergeSchema', 'true') Spark jamoangizga .write или .writeStream.

# Добавьте параметр mergeSchema
loans.write.format("delta") 
           .option("mergeSchema", "true") 
           .mode("append") 
           .save(DELTALAKE_SILVER_PATH)

Grafikni ko'rish uchun quyidagi Spark SQL so'rovini bajaring

# Создайте график с новым столбцом, чтобы подтвердить, что запись прошла успешно
%sql
SELECT addr_state, sum(`amount`) AS amount
FROM loan_by_state_delta
GROUP BY addr_state
ORDER BY sum(`amount`)
DESC LIMIT 10

Delta ko'liga sho'ng'ish: sxemani qo'llash va evolyutsiya
Shu bilan bir qatorda, qoʻshish orqali ushbu parametrni butun Spark seansi uchun oʻrnatishingiz mumkin spark.databricks.delta.schema.autoMerge = True Spark konfiguratsiyasiga. Ammo bundan ehtiyotkorlik bilan foydalaning, chunki sxemani qo'llash endi sizni tasodifiy sxema nomuvofiqliklari haqida ogohlantirmaydi.

Parametrni so'rovga kiritish orqali mergeSchema, DataFrame-da mavjud bo'lgan, ammo maqsadli jadvalda bo'lmagan barcha ustunlar yozish tranzaktsiyasining bir qismi sifatida avtomatik ravishda sxemaning oxiriga qo'shiladi. Ichki maydonlar ham qo'shilishi mumkin va ular tegishli tuzilma ustunlarining oxiriga ham qo'shiladi.

Sana muhandislari va ma'lumotlar bo'yicha olimlar eski ustunlar asosidagi mavjud modellarni buzmasdan, mavjud mashinani o'rganish ishlab chiqarish jadvallariga yangi ustunlar (ehtimol yaqinda kuzatilgan ko'rsatkich yoki bu oyning savdo samaradorligi ustuni) qo'shish uchun ushbu parametrdan foydalanishlari mumkin.

Jadvalni qo'shish yoki qayta yozish paytida sxema evolyutsiyasining bir qismi sifatida quyidagi sxema o'zgarishlariga ruxsat beriladi:

  • Yangi ustunlar qo'shish (bu eng keng tarqalgan stsenariy)
  • NullType -> har qanday boshqa turdagi ma'lumotlar turlarini o'zgartirish yoki ByteType -> ShortType -> IntegerType dan targ'ib qilish

Sxema evolyutsiyasida ruxsat etilmagan boshqa o'zgarishlar sxema va ma'lumotlarni qo'shish orqali qayta yozishni talab qiladi .option("overwriteSchema", "true"). Misol uchun, agar "Foo" ustuni dastlab butun son bo'lsa va yangi sxema ma'lumotlar qatori bo'lsa, barcha Parket (ma'lumotlar) fayllarini qayta yozish kerak bo'ladi. Bunday o'zgarishlarga quyidagilar kiradi:

  • ustunni o'chirish
  • mavjud ustunning ma'lumotlar turini o'zgartirish (joyida)
  • faqat har xil bo'lgan ustunlar nomini o'zgartirish (masalan, "Foo" va "foo")

Nihoyat, Spark 3.0 ning keyingi versiyasi bilan aniq DDL toʻliq qoʻllab-quvvatlanadi (ALTER TABLE yordamida), foydalanuvchilarga jadval sxemalarida quyidagi amallarni bajarishga imkon beradi:

  • ustunlar qo'shish
  • ustun sharhlarini o'zgartirish
  • tranzaktsiyalar jurnalini saqlash vaqtini belgilash kabi jadval xatti-harakatlarini boshqaradigan jadval xususiyatlarini o'rnatish.

Sxema evolyutsiyasining foydasi nimada?

Sxema evolyutsiyasi istalgan vaqtda ishlatilishi mumkin niyat qilmoq jadvalingiz sxemasini o'zgartiring (tasodifan DataFrame-ga u erda bo'lmasligi kerak bo'lgan ustunlarni qo'shganingizdan farqli o'laroq). Bu sizning sxemangizni ko'chirishning eng oson usuli, chunki u to'g'ri ustun nomlari va ma'lumotlar turlarini ularni aniq e'lon qilmasdan avtomatik ravishda qo'shadi.

xulosa

Sxemani qo'llash jadvalingizga mos kelmaydigan har qanday yangi ustunlar yoki boshqa sxema o'zgarishlarini rad etadi. Ushbu yuqori standartlarni o'rnatish va qo'llab-quvvatlash orqali tahlilchilar va muhandislar o'zlarining ma'lumotlari eng yuqori darajadagi yaxlitlikka ega ekanligiga ishonishlari, ularni aniq va ravshan etkazishlari va ularga biznes qarorlarini yaxshiroq qabul qilishlariga imkon berishlari mumkin.

Boshqa tomondan, sxema evolyutsiyasi soddalashtirish orqali amalga oshirishni to'ldiradi da'vo qilingan avtomatik sxema o'zgarishi. Axir, ustun qo'shish qiyin bo'lmasa kerak.

Sxemaning majburiy qo'llanilishi yang, bu erda sxemaning evolyutsiyasi yin. Birgalikda foydalanilganda, bu xususiyatlar shovqinni bostirish va signalni sozlashni har qachongidan ham osonlashtiradi.

Shuningdek, ushbu maqolaga qo'shgan hissalari uchun Mukul Murti va Pranav Anandga minnatdorchilik bildiramiz.

Ushbu turkumdagi boshqa maqolalar:

Delta ko'liga sho'ng'ish: tranzaksiya jurnalini ochish

Mavzu bo'yicha maqolalar

Delta ko'li bilan ishlab chiqarish darajasida mashinani o'rganish

Data ko'li nima?

Kurs haqida ko'proq bilib oling

Manba: www.habr.com

a Izoh qo'shish