Delta Lake Dive: İcra və Sxem Təkamülü

Hey Habr! Məqalənin tərcüməsini diqqətinizə təqdim edirəm "Delta gölünə dalış: Sxemanın tətbiqi və təkamül" müəlliflər Burak Yavuz, Brenner Heintz və Denny Lee, kursun başlaması ərəfəsində hazırlanmışdır. Məlumat Mühəndisi OTUS-dan.

Delta Lake Dive: İcra və Sxem Təkamülü

Məlumatlar, bizim təcrübəmiz kimi, daim toplanır və inkişaf edir. Davam etmək üçün dünyanın zehni modellərimiz yeni məlumatlara uyğunlaşmalıdır, bəziləri yeni ölçüləri ehtiva edir - əvvəllər haqqında heç bir təsəvvürümüz olmayan şeyləri müşahidə etməyin yeni yolları. Bu zehni modellər yeni məlumatları necə kateqoriyalara ayırdığımızı və emal etdiyimizi müəyyən edən cədvəl sxemlərindən çox da fərqlənmir.

Bu, bizi sxemlərin idarə edilməsi məsələsinə gətirir. Biznes problemləri və tələbləri zamanla dəyişdikcə, məlumatlarınızın strukturu da dəyişir. Delta Lake məlumat dəyişikliyi kimi yeni ölçmələri təqdim etməyi asanlaşdırır. İstifadəçilər cədvəl sxemlərini idarə etmək üçün sadə semantikaya giriş əldə edirlər. Bu alətlərə istifadəçiləri səhvlər və ya lazımsız məlumatlarla öz cədvəllərini istəmədən çirkləndirməkdən qoruyan Schema Enforcement və qiymətli məlumatların yeni sütunlarını avtomatik olaraq müvafiq yerlərə əlavə etməyə imkan verən Schema Evolution daxildir. Bu yazıda biz bu alətlərdən istifadəni daha dərindən araşdıracağıq.

Cədvəl sxemlərinin başa düşülməsi

Apache Spark-dakı hər bir DataFrame məlumat növləri, sütunlar və metadata kimi verilənlərin formasını müəyyən edən sxemdən ibarətdir. Delta Lake ilə cədvəl sxemi əməliyyat jurnalında JSON formatında saxlanılır.

Sxem icrası nədir?

Şemanın Təhlili kimi də tanınan Şemanın Tətbiqi, Delta Gölündə cədvəlin sxeminə uyğun gəlməyən qeydləri rədd edərək məlumat keyfiyyətini təmin edən təhlükəsizlik mexanizmidir. Məşhur yalnız rezervasiya restoranının ön masasında oturan sahibə kimi, o, cədvələ daxil edilmiş hər bir məlumat sütununun gözlənilən sütunların müvafiq siyahısında olub-olmadığını yoxlayır (başqa sözlə, onların hər biri üçün "rezervasiya" olub-olmadığını yoxlayır. ) və siyahıda olmayan sütunlu hər hansı qeydləri rədd edir.

Sxemanın tətbiqi necə işləyir?

Delta Lake schema-on-write yoxlanışından istifadə edir, yəni cədvələ bütün yeni yazılar yazma zamanı hədəf cədvəlin sxemi ilə uyğunluq üçün yoxlanılır. Sxem uyğunsuzdursa, Delta Lake əməliyyatı tamamilə dayandırır (heç bir məlumat yazılmır) və uyğunsuzluq barədə istifadəçini xəbərdar etmək üçün bir istisna yaradır.
Delta Lake qeydin cədvəllə uyğun olub olmadığını müəyyən etmək üçün aşağıdakı qaydalardan istifadə edir. Yazıla bilən DataFrame:

  • hədəf cədvəlin sxemində olmayan əlavə sütunları ehtiva edə bilməz. Əksinə, əgər daxil olan məlumatlar cədvəldəki bütün sütunları ehtiva etmirsə, hər şey qaydasındadır - bu sütunlara sadəcə null dəyərlər təyin olunacaq.
  • hədəf cədvəldəki sütunların məlumat tiplərindən fərqli sütun məlumat növləri ola bilməz. Hədəf cədvəli sütununda StringType datası varsa, lakin DataFrame-dəki müvafiq sütunda IntegerType datası varsa, sxemin tətbiqi istisna təşkil edəcək və yazma əməliyyatının baş verməsinin qarşısını alacaq.
  • yalnız halda fərqlənən sütun adlarını ehtiva edə bilməz. Bu o deməkdir ki, eyni cədvəldə müəyyən edilmiş "Foo" və "foo" adlı sütunlarınız ola bilməz. Spark böyük hərflərə həssas və ya hərflərə həssas olmayan (defolt) rejimdə istifadə oluna bilsə də, Delta Gölü hərf hərfləri qoruyur, lakin sxem yaddaşında həssas deyil. Sütun məlumatlarını saxlayarkən və qaytararkən parket hərflərə həssasdır. Mümkün xətaların, məlumatların pozulmasının və ya məlumat itkisinin qarşısını almaq üçün (Databricks-də şəxsən yaşadığımız bir şey) bu məhdudiyyəti əlavə etmək qərarına gəldik.

Bunu göstərmək üçün, gəlin onları qəbul etmək üçün hələ konfiqurasiya olunmamış Delta Gölü cədvəlinə bəzi yeni yaradılmış sütunları əlavə etməyə çalışarkən aşağıdakı kodda nə baş verdiyinə nəzər salaq.

# Сгенерируем 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 olaraq yeni sütunlar əlavə etmək əvəzinə, Delta Lake bir sxem tətbiq edir və yazmağı dayandırır. Hansı sütunun (və ya sütunlar dəstinin) uyğunsuzluğa səbəb olduğunu müəyyən etmək üçün Spark müqayisə üçün hər iki sxemi yığın izindən çıxarır.

Sxemi tətbiq etməyin faydası nədir?

Sxemanın tətbiqi kifayət qədər ciddi yoxlama olduğundan, istehsal və ya istehlaka hazır olan təmiz, tam dəyişdirilmiş məlumat dəstinə qapıçı kimi istifadə etmək üçün əla vasitədir. Bir qayda olaraq, məlumatları birbaşa qidalandıran cədvəllərə tətbiq olunur:

  • Maşın öyrənmə alqoritmləri
  • BI idarə panelləri
  • Məlumatların təhlili və vizuallaşdırma vasitələri
  • Yüksək strukturlaşdırılmış, güclü tipli semantik sxemlər tələb edən istənilən istehsal sistemi.

Məlumatlarını bu son maneəyə hazırlamaq üçün bir çox istifadəçi tədricən strukturu cədvəllərinə daxil edən sadə “çox-hop” arxitekturasından istifadə edir. Bu barədə daha çox məlumat əldə etmək üçün məqaləyə baxa bilərsiniz Delta Lake ilə istehsal dərəcəli maşın öyrənməsi.

Əlbəttə ki, sxemin tətbiqi boru kəmərinizin istənilən yerində istifadə edilə bilər, lakin unutmayın ki, bu halda cədvələ axın etmək əsəbi ola bilər, çünki, məsələn, daxil olan məlumatlara başqa sütun əlavə etdiyinizi unutmusunuz.

Məlumatların seyreltilməsinin qarşısının alınması

İndiyə qədər siz maraqlana bilərsiniz ki, bütün təlaş nə ilə bağlıdır? Axı, bəzən gözlənilməz "şema uyğunsuzluğu" xətası, xüsusən də Delta Lake-də yenisinizsə, iş prosesinizdə sizi itələyə bilər. Nəyə görə sadəcə olaraq sxemin lazım olduğu kimi dəyişməsinə icazə vermirəm ki, nə olursa olsun DataFrame-i yaza biləm?

Köhnə deyimdə deyildiyi kimi, "bir unsiya qarşısının alınması bir funt müalicəyə dəyər". Müəyyən bir nöqtədə, sxeminizi tətbiq etməyə diqqət yetirməsəniz, məlumat növü uyğunluğu problemləri onların çirkin başlarını qaldıracaq - zahirən homogen xam məlumat mənbələrində kənar hallar, zədələnmiş sütunlar, düzgün olmayan xəritələr və ya xəyal etmək üçün başqa qorxulu şeylər ola bilər. kabuslar. Ən yaxşı yanaşma, bu düşmənləri qapıda dayandırmaqdır - sxem tətbiqi ilə - və onlar istehsal kodunuzun qaranlıq dərinliklərində gizlənməyə başlayanda deyil, işıqda onlarla məşğul olmaqdır.

Sxemi tətbiq etmək sizə əminlik verir ki, siz dəyişikliyi təsdiqləməsəniz, cədvəlinizin sxemi dəyişməyəcək. Bu, yeni sütunlar o qədər tez-tez əlavə olunduqda baş verə biləcək məlumatların seyreltilməsinin qarşısını alır ki, əvvəllər qiymətli, sıxılmış cədvəllər məlumatların su basması səbəbindən öz mənasını və faydalılığını itirir. Sizi qəsdən olmağa, yüksək standartlar təyin etməyə və yüksək keyfiyyət gözləməyə sövq etməklə, sxemin tətbiqi tam olaraq nəzərdə tutulduğunu yerinə yetirir - vicdanlı və elektron cədvəllərinizi təmiz saxlamağa kömək edir.

Əgər daha çox düşünüb qərara alırsan ki, həqiqətən ehtiyacı var yeni sütun əlavə edin - problem yoxdur, aşağıda bir sətirli düzəliş var. Həll dövrənin təkamülüdür!

Sxem təkamülü nədir?

Sxema təkamülü istifadəçilərə zamanla dəyişən məlumatlara görə cari cədvəl sxemini asanlıqla dəyişməyə imkan verən bir xüsusiyyətdir. Sxemi avtomatik olaraq bir və ya bir neçə yeni sütun daxil etmək üçün uyğunlaşdırmaq üçün əlavə və ya yenidən yazma əməliyyatını yerinə yetirərkən ən çox istifadə olunur.

Sxema təkamülü necə işləyir?

Əvvəlki bölmədəki nümunədən sonra tərtibatçılar sxem uyğunsuzluğu səbəbindən əvvəllər rədd edilmiş yeni sütunları əlavə etmək üçün sxem təkamülünü asanlıqla istifadə edə bilərlər. Dövrə təkamülü əlavə etməklə aktivləşdirilir .option('mergeSchema', 'true') Spark komandanıza .write или .writeStream.

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

Qrafikə baxmaq üçün aşağıdakı Spark SQL sorğusunu yerinə yetirin

# Создайте график с новым столбцом, чтобы подтвердить, что запись прошла успешно
%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 Lake Dive: İcra və Sxem Təkamülü
Alternativ olaraq, əlavə etməklə bu seçimi bütün Spark sessiyası üçün təyin edə bilərsiniz spark.databricks.delta.schema.autoMerge = True Spark konfiqurasiyasına. Lakin bundan ehtiyatla istifadə edin, çünki sxemin tətbiqi artıq sizi qeyri-ixtiyari sxem uyğunsuzluqları barədə xəbərdar etməyəcək.

Sorğuya parametr daxil etməklə mergeSchema, DataFrame-də mövcud olan, lakin hədəf cədvəlində olmayan bütün sütunlar yazma əməliyyatının bir hissəsi kimi avtomatik olaraq sxemin sonuna əlavə edilir. İç-içə sahələr də əlavə edilə bilər və bunlar da müvafiq struktur sütunlarının sonuna əlavə olunacaq.

Tarix mühəndisləri və məlumat alimləri köhnə sütunlara əsaslanan mövcud modelləri pozmadan mövcud maşın öyrənmə istehsal cədvəllərinə yeni sütunlar (bəlkə də bu yaxınlarda izlənilən metrik və ya bu ayın satış performansı sütunu) əlavə etmək üçün bu seçimdən istifadə edə bilərlər.

Cədvəllərin əlavə edilməsi və ya yenidən yazılması zamanı sxem təkamülünün bir hissəsi kimi aşağıdakı sxem dəyişikliklərinə icazə verilir:

  • Yeni sütunların əlavə edilməsi (bu, ən ümumi ssenaridir)
  • NullType -> hər hansı digər növdən məlumat növlərinin dəyişdirilməsi və ya ByteType -> ShortType -> IntegerType-dən təşviq edilməsi

Sxem təkamülündə icazə verilməyən digər dəyişikliklər sxem və məlumatların əlavə edilərək yenidən yazılmasını tələb edir .option("overwriteSchema", "true"). Məsələn, "Foo" sütununun əvvəlcə tam ədəd olduğu və yeni sxemin sətir məlumat növü olduğu halda, bütün Parket(məlumatlar) faylları yenidən yazılmalıdır. Belə dəyişikliklər daxildir:

  • sütunun silinməsi
  • mövcud sütunun məlumat növünün dəyişdirilməsi (yerində)
  • yalnız hər halda fərqlənən sütunların adının dəyişdirilməsi (məsələn, "Foo" və "foo")

Nəhayət, Spark 3.0-ın növbəti buraxılışı ilə açıq DDL tam dəstəklənəcək (ALTER TABLE istifadə edərək, istifadəçilərə cədvəl sxemlərində aşağıdakı hərəkətləri yerinə yetirməyə imkan verəcək:

  • sütunların əlavə edilməsi
  • sütun şərhlərinin dəyişdirilməsi
  • əməliyyat jurnalının saxlanma müddətinin təyin edilməsi kimi cədvəlin davranışını idarə edən cədvəl xassələrinin təyin edilməsi.

Dövrə təkamülünün faydası nədir?

Şema təkamülü istədiyiniz zaman istifadə edilə bilər niyyət etmək cədvəlinizin sxemini dəyişdirin (təsadüfən DataFrame-ə orada olmamalı olan sütunları əlavə etdiyinizdən fərqli olaraq). Bu, sxeminizi köçürməyin ən asan yoludur, çünki o, avtomatik olaraq düzgün sütun adlarını və məlumat növlərini açıq şəkildə bəyan etmədən əlavə edir.

Nəticə

Sxem tətbiqi cədvəlinizə uyğun olmayan hər hansı yeni sütunları və ya digər sxem dəyişikliklərini rədd edir. Bu yüksək standartları müəyyən etmək və saxlamaqla analitiklər və mühəndislər öz məlumatlarının ən yüksək bütövlük səviyyəsinə malik olduğuna, onları aydın və aydın şəkildə çatdıraraq onlara daha yaxşı biznes qərarları qəbul etməyə imkan yarada biləcəklərinə etibar edə bilərlər.

Digər tərəfdən, sxem təkamülü sadələşdirməklə tətbiqi tamamlayır iddia edilir avtomatik sxem dəyişiklikləri. Axı sütun əlavə etmək çətin olmamalıdır.

Sxemin məcburi tətbiqi yangdır, burada sxemin təkamülü yindir. Birlikdə istifadə edildikdə, bu xüsusiyyətlər səs-küyün yatırılmasını və siqnalın tənzimlənməsini həmişəkindən daha asan edir.

Bu məqaləyə töhfələrinə görə Mukul Murthy və Pranav Anand-a da təşəkkür etmək istərdik.

Bu seriyadakı digər məqalələr:

Delta gölünə dalın: Əməliyyat jurnalının qablaşdırılması

Mövzu ilə bağlı məqalələr

Delta Lake ilə istehsal dərəcəli maşın öyrənməsi

Məlumat gölü nədir?

Kurs haqqında ətraflı məlumat əldə edin

Mənbə: www.habr.com

Добавить комментарий