شیرجه رفتن به دریاچه دلتا: اجرای طرحواره و تکامل

هی هابر! ترجمه مقاله را مورد توجه شما قرار می دهم "غواصی در دریاچه دلتا: اجرای طرحواره و تکامل" نویسندگان بوراک یاووز، برنر هاینتز و دنی لی، که در پیش بینی شروع دوره آماده شده بود. مهندس داده از OTUS

شیرجه رفتن به دریاچه دلتا: اجرای طرحواره و تکامل

داده ها، مانند تجربه ما، دائما در حال انباشته شدن و تکامل هستند. برای ادامه، مدل‌های ذهنی ما از جهان باید با داده‌های جدید سازگار شوند، که برخی از آن‌ها دارای ابعاد جدیدی هستند - روش‌های جدیدی برای مشاهده چیزهایی که قبلاً هیچ ایده‌ای درباره آنها نداشتیم. این مدل‌های ذهنی با طرح‌واره‌های جدولی که نحوه طبقه‌بندی و پردازش اطلاعات جدید را تعیین می‌کنند، تفاوت چندانی ندارند.

این ما را به موضوع مدیریت طرحواره می رساند. همانطور که چالش ها و الزامات کسب و کار در طول زمان تغییر می کند، ساختار داده های شما نیز تغییر می کند. دریاچه دلتا معرفی اندازه گیری های جدید را با تغییر داده ها آسان می کند. کاربران برای مدیریت طرحواره های جدول خود به معنایی ساده دسترسی دارند. این ابزارها عبارتند از Schema Enforcement که کاربران را از آلودگی ناخواسته جداول با خطاها یا داده های غیر ضروری محافظت می کند و Schema Evolution که اجازه می دهد ستون های جدیدی از داده های ارزشمند به طور خودکار به مکان های مناسب اضافه شوند. در این مقاله، ما عمیق‌تر به استفاده از این ابزارها خواهیم پرداخت.

درک طرحواره های جدول

هر DataFrame در Apache Spark حاوی طرحی است که شکل داده‌ها مانند انواع داده‌ها، ستون‌ها و ابرداده‌ها را مشخص می‌کند. با Delta Lake، طرح جدول در قالب JSON در گزارش تراکنش ذخیره می شود.

اجرای طرح چیست؟

Schema Enforcement که با نام Schema Validation نیز شناخته می‌شود، یک مکانیسم امنیتی در Delta Lake است که کیفیت داده‌ها را با رد کردن رکوردهایی که با طرح جدول مطابقت ندارند تضمین می‌کند. مانند مهماندار در میز جلو یک رستوران محبوب فقط برای رزرواسیون، او بررسی می کند که آیا هر ستون از داده های وارد شده به جدول در لیست مربوطه از ستون های مورد انتظار است (به عبارت دیگر، آیا برای هر یک از آنها "رزرو" وجود دارد یا خیر. ) و هر رکوردی با ستون هایی که در لیست نیستند را رد می کند.

اجرای طرحواره چگونه کار می کند؟

Delta Lake از بررسی طرحواره در نوشتن استفاده می کند، به این معنی که تمام نوشته های جدید در جدول برای سازگاری با طرح جدول هدف در زمان نوشتن بررسی می شوند. اگر طرحواره ناسازگار باشد، دریاچه دلتا تراکنش را به طور کامل لغو می کند (هیچ داده ای نوشته نشده است) و استثنایی برای اطلاع کاربر از ناسازگاری ایجاد می کند.
دلتا لیک از قوانین زیر برای تعیین اینکه آیا یک رکورد با جدول سازگار است یا خیر استفاده می کند. DataFrame قابل نوشتن:

  • نمی تواند شامل ستون های اضافی باشد که در طرح جدول هدف نیستند. برعکس، اگر داده های دریافتی مطلقاً تمام ستون های جدول را نداشته باشند، همه چیز خوب است - به این ستون ها به سادگی مقادیر تهی اختصاص داده می شود.
  • نمی تواند انواع داده های ستونی متفاوت با انواع داده های ستون های جدول هدف داشته باشد. اگر ستون جدول هدف حاوی داده‌های StringType باشد، اما ستون مربوطه در DataFrame حاوی داده‌های IntegerType باشد، اجرای طرح یک استثنا ایجاد می‌کند و از انجام عملیات نوشتن جلوگیری می‌کند.
  • نمی تواند شامل نام ستون هایی باشد که فقط در حروف کوچک و بزرگ متفاوت هستند. این به این معنی است که شما نمی توانید ستون هایی به نام "فو" و "فو" را در یک جدول تعریف کنید. در حالی که Spark را می توان در حالت حساس به حروف بزرگ یا بزرگ و کوچک (پیش فرض) استفاده کرد، دریاچه دلتا دارای حروف کوچک و بزرگ است اما در فضای ذخیره سازی طرحواره حساس نیست. پارکت هنگام ذخیره و بازگرداندن اطلاعات ستون به حروف کوچک و بزرگ حساس است. برای جلوگیری از خطاهای احتمالی، خرابی داده ها یا از دست دادن داده ها (چیزی که ما شخصاً در Databricks تجربه کردیم)، تصمیم گرفتیم این محدودیت را اضافه کنیم.

برای نشان دادن این موضوع، اجازه دهید نگاهی به آنچه در کد زیر رخ می دهد بیندازیم وقتی می خواهیم تعدادی ستون جدید ایجاد شده را به جدول دلتا لیک اضافه کنیم که هنوز برای پذیرش آنها پیکربندی نشده است.

# Сгенерируем 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.

دریاچه دلتا به جای اضافه کردن خودکار ستون‌های جدید، طرحی را تحمیل می‌کند و نوشتن را متوقف می‌کند. برای کمک به تعیین اینکه کدام ستون (یا مجموعه‌ای از ستون‌ها) باعث ایجاد اختلاف می‌شود، Spark هر دو طرحواره را از stack trace برای مقایسه خارج می‌کند.

فایده اجرای طرحواره چیست؟

از آنجایی که اجرای طرحواره یک بررسی نسبتاً سختگیرانه است، ابزاری عالی برای استفاده به عنوان دروازه‌بان یک مجموعه داده تمیز و کاملاً تغییر یافته است که برای تولید یا مصرف آماده است. معمولاً برای جداولی که مستقیماً داده ها را تغذیه می کنند اعمال می شود:

  • الگوریتم های یادگیری ماشینی
  • داشبوردهای BI
  • تجزیه و تحلیل داده ها و ابزارهای تجسم
  • هر سیستم تولیدی که به طرح‌واره‌های معنایی بسیار ساختاریافته و قوی نیاز دارد.

برای آماده سازی داده های خود برای این مانع نهایی، بسیاری از کاربران از یک معماری ساده "مولتی هاپ" استفاده می کنند که به تدریج ساختار را وارد جداول آنها می کند. برای کسب اطلاعات بیشتر در این مورد، می توانید مقاله را بررسی کنید یادگیری ماشینی درجه تولید با دلتا لیک.

البته، اجرای طرحواره را می توان در هر نقطه ای از خط لوله خود استفاده کرد، اما به یاد داشته باشید که در این مورد جریان به جدول می تواند خسته کننده باشد، زیرا، برای مثال، فراموش کرده اید که ستون دیگری را به داده های ورودی اضافه کرده اید.

جلوگیری از رقیق شدن داده ها

در حال حاضر ممکن است تعجب کنید که این همه هیاهو برای چیست؟ به هر حال، گاهی اوقات یک خطای غیرمنتظره «عدم تطابق طرحواره» می‌تواند شما را در جریان کارتان غافلگیر کند، به خصوص اگر تازه وارد دلتا لیک شده باشید. چرا اجازه نمی‌دهیم طرحواره در صورت لزوم تغییر کند تا بتوانم DataFrame خود را بدون توجه به هر چیزی بنویسم؟

به قول قدیمی ها، "یک اونس پیشگیری ارزش یک پوند درمان دارد." در برخی مواقع، اگر مراقب اجرای طرحواره خود نباشید، مسائل مربوط به سازگاری نوع داده‌ها سر زشت خود را به دنبال خواهد داشت - منابع داده خام به ظاهر همگن ممکن است حاوی موارد لبه، ستون‌های خراب، نگاشت‌های نادرست یا چیزهای ترسناک دیگری باشند که می‌توان در مورد آنها رویاپردازی کرد. کابوس ها بهترین رویکرد این است که این دشمنان را در دروازه متوقف کنید - با اجرای طرحواره - و با آنها در روشنایی برخورد کنید، نه اینکه بعداً در اعماق تاریک کد تولید شما کمین کنند.

اجرای یک طرح به شما این اطمینان را می دهد که طرح جدول شما تغییر نخواهد کرد مگر اینکه شما تغییر را تأیید کنید. این امر از رقیق شدن داده ها جلوگیری می کند، که می تواند زمانی رخ دهد که ستون های جدید به قدری مکرر اضافه شوند که جداول فشرده و ارزشمند قبلی به دلیل طغیان داده ها معنی و سودمندی خود را از دست بدهند. اجرای طرحواره با تشویق شما به عمدی بودن، تعیین استانداردهای بالا و انتظار کیفیت بالا، دقیقاً همان کاری را انجام می دهد که برای انجام آن طراحی شده است - به شما کمک می کند با وجدان بمانید و صفحات گسترده خود را تمیز کنید.

اگر با بررسی بیشتر تصمیم گرفتید که واقعاً نیازمند یک ستون جدید اضافه کنید - مشکلی نیست، در زیر یک اصلاح یک خطی وجود دارد. راه حل تکامل مدار است!

تکامل طرحواره چیست؟

تکامل طرحواره قابلیتی است که به کاربران امکان می دهد به راحتی طرح جدول فعلی را با توجه به داده هایی که در طول زمان تغییر می کنند تغییر دهند. اغلب هنگام اجرای عملیات پیوست یا بازنویسی برای تطبیق خودکار طرحواره برای گنجاندن یک یا چند ستون جدید استفاده می شود.

تکامل طرحواره چگونه کار می کند؟

با پیروی از مثال بخش قبل، توسعه دهندگان می توانند به راحتی از تکامل طرح برای اضافه کردن ستون های جدید استفاده کنند که قبلاً به دلیل ناسازگاری طرح رد شده بودند. تکامل مدار با افزودن فعال می شود .option('mergeSchema', 'true') به تیم اسپارک شما .write или .writeStream.

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

برای مشاهده نمودار، کوئری Spark SQL زیر را اجرا کنید

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

شیرجه رفتن به دریاچه دلتا: اجرای طرحواره و تکامل
همچنین می توانید با افزودن این گزینه را برای کل جلسه Spark تنظیم کنید spark.databricks.delta.schema.autoMerge = True به پیکربندی Spark. اما از این با احتیاط استفاده کنید، زیرا اجرای طرح‌واره دیگر شما را نسبت به تناقضات غیرعمدی طرحواره آگاه نمی‌کند.

با درج پارامتر در درخواست mergeSchema، تمام ستون هایی که در DataFrame وجود دارند اما در جدول هدف وجود ندارند به طور خودکار به انتهای طرح به عنوان بخشی از تراکنش نوشتن اضافه می شوند. فیلدهای تودرتو نیز می توانند اضافه شوند و اینها نیز به انتهای ستون های ساختار مربوطه اضافه می شوند.

مهندسان داده و دانشمندان داده می‌توانند از این گزینه برای اضافه کردن ستون‌های جدید (شاید یک متریک اخیراً پیگیری شده یا ستون عملکرد فروش این ماه) به جداول تولید یادگیری ماشین موجود خود بدون شکستن مدل‌های موجود بر اساس ستون‌های قدیمی استفاده کنند.

انواع زیر از تغییرات طرحواره به عنوان بخشی از تکامل طرحواره در طول اضافه کردن یا بازنویسی جدول مجاز است:

  • اضافه کردن ستون های جدید (این رایج ترین سناریو است)
  • تغییر انواع داده از NullType -> هر نوع دیگری یا تبلیغ از ByteType -> ShortType -> IntegerType

سایر تغییراتی که در تکامل طرحواره مجاز نیستند، مستلزم آن است که طرح و داده ها با افزودن بازنویسی شوند .option("overwriteSchema", "true"). به عنوان مثال، در موردی که ستون "Foo" در ابتدا یک عدد صحیح بود و طرحواره جدید یک نوع داده رشته ای بود، پس همه فایل های Parquet(data) باید بازنویسی شوند. چنین تغییراتی عبارتند از:

  • حذف یک ستون
  • تغییر نوع داده یک ستون موجود (درجا)
  • تغییر نام ستون هایی که فقط در مورد متفاوت هستند (به عنوان مثال، "Foo" و "foo")

در نهایت، با انتشار بعدی Spark 3.0، DDL صریح به طور کامل پشتیبانی می‌شود (با استفاده از ALTER TABLE)، که به کاربران اجازه می‌دهد اقدامات زیر را روی طرح‌واره‌های جدول انجام دهند:

  • اضافه کردن ستون ها
  • تغییر نظرات ستون
  • تنظیم ویژگی‌های جدول که رفتار جدول را کنترل می‌کند، مانند تنظیم مدت زمانی که یک گزارش تراکنش ذخیره می‌شود.

مزیت تکامل مدار چیست؟

تکامل طرحواره می تواند هر زمان که شما استفاده می شود قصد داشتن - خواستن طرح جدول خود را تغییر دهید (برخلاف زمانی که به طور تصادفی ستون هایی را به DataFrame خود اضافه کردید که نباید در آنجا باشند). این ساده‌ترین راه برای انتقال طرحواره است زیرا به‌طور خودکار نام ستون‌ها و انواع داده‌های صحیح را بدون نیاز به اعلام صریح آنها اضافه می‌کند.

نتیجه

اجرای طرحواره هرگونه ستون جدید یا سایر تغییرات طرحواره را که با جدول شما سازگار نیست رد می کند. با تنظیم و حفظ این استانداردهای بالا، تحلیلگران و مهندسان می توانند اعتماد کنند که داده های آنها دارای بالاترین سطح یکپارچگی است، و آن ها را به طور واضح و واضح منتقل می کند و به آنها اجازه می دهد تصمیمات تجاری بهتری بگیرند.

از سوی دیگر، تکامل طرحواره با ساده سازی، اجرا را تکمیل می کند فرض می شود تغییرات خودکار طرحواره پس از همه، اضافه کردن یک ستون نباید دشوار باشد.

کاربرد اجباری این طرح یانگ است، جایی که تکامل طرح یین است. هنگامی که این ویژگی ها با هم استفاده می شوند، سرکوب نویز و تنظیم سیگنال را آسان تر از همیشه می کنند.

همچنین مایلیم از موکول مورتی و پراناو آناند برای کمک به این مقاله تشکر کنیم.

سایر مقالات این مجموعه:

شیرجه زدن به دریاچه دلتا: باز کردن گزارش معاملات

مقالات مرتبط

یادگیری ماشینی درجه تولید با دلتا لیک

دریاچه داده چیست؟

در مورد دوره بیشتر بدانید

منبع: www.habr.com

اضافه کردن نظر