أداة بناء البيانات أو ما هو مشترك بين مستودع البيانات وعصير


ما هي مبادئ مستودع البيانات المثالي؟

ركز على قيمة الأعمال والتحليلات في حالة عدم وجود شفرة مرجعية. إدارة DWH كقاعدة تعليمات برمجية: تعيين الإصدارات والمراجعة والاختبار الآلي و CI. النموذجية ، التمدد ، المصدر المفتوح والمجتمع. توثيق المستخدم ودية وتصور التبعية (نسب البيانات).

المزيد عن كل هذا وعن دور DBT في النظام البيئي للبيانات الضخمة والتحليلات - مرحبًا بك.

تحية للجميع


على اتصال مع Artemy Kozyr. منذ أكثر من 5 سنوات ، كنت أعمل مع مستودعات البيانات ، وبناء ETL / ELT ، بالإضافة إلى تحليلات البيانات والتصور. أعمل حاليًا في Wheely ، أدرس في OTUS في دورة مهندس البيانات ، واليوم أريد أن أشارك معك مقالًا كتبته عشية بدء مجموعة جديدة من الدورات التدريبية .

مراجعة قصيرة


إطار عمل DBT هو كل شيء عن الحرف T في اختصار ELT (استخراج - تحويل - تحميل).

مع ظهور قواعد بيانات تحليلية منتجة وقابلة للتطوير مثل BigQuery و Redshift و Snowflake ، اختفى أي معنى لإجراء تحويلات خارج مستودع البيانات. 

لا يقوم DBT بتنزيل البيانات من المصادر ، ولكنه يوفر فرصًا هائلة للعمل مع البيانات التي تم تحميلها بالفعل في التخزين (في التخزين الداخلي أو الخارجي).


الغرض الرئيسي من DBT هو أخذ الشفرة وتجميعها في SQL وتنفيذ الأوامر بالتسلسل الصحيح في المستودع.

هيكل مشروع DBT


يتكون المشروع من أدلة وملفات من نوعين فقط:

  • Model (.sql) - وحدة التحويل التي يعبر عنها استعلام SELECT
  • ملف التكوين (.yml) - المعلمات والإعدادات والاختبارات والتوثيق

على المستوى الأساسي ، يتم تنظيم العمل على النحو التالي:

  • يقوم المستخدم بإعداد رمز النموذج في أي بيئة تطوير متكاملة مناسبة
  • باستخدام CLI ، يتم إطلاق النماذج ، يجمع DBT رمز النموذج في SQL
  • يتم تنفيذ كود SQL المترجم في المستودع بالتسلسل المحدد (الرسم البياني)

إليك ما قد يبدو عليه الإطلاق من CLI:


كل شيء هو SELECT


هذه ميزة قاتلة في إطار أداة بناء البيانات. بمعنى آخر ، يلخص DBT جميع التعليمات البرمجية المتعلقة بتحقيق استفساراتك في المستودع (أشكال مختلفة من الأوامر CREATE ، INSERT ، UPDATE ، DELETE ALTER ، GRANT ، ...).

يتضمن أي نموذج كتابة استعلام SELECT واحد ، والذي يحدد مجموعة البيانات الناتجة.

في الوقت نفسه ، يمكن أن يكون منطق التحويل متعدد المستويات ويدمج البيانات من عدة نماذج أخرى. مثال على نموذج سيبني عرضًا للأوامر (f_order):

{% set payment_methods = ['credit_card', 'coupon', 'bank_transfer', 'gift_card'] %}
 
with orders as (
 
   select * from {{ ref('stg_orders') }}
 
),
 
order_payments as (
 
   select * from {{ ref('order_payments') }}
 
),
 
final as (
 
   select
       orders.order_id,
       orders.customer_id,
       orders.order_date,
       orders.status,
       {% for payment_method in payment_methods -%}
       order_payments.{{payment_method}}_amount,
       {% endfor -%}
       order_payments.total_amount as amount
   from orders
       left join order_payments using (order_id)
 
)
 
select * from final

ما هي الأشياء المثيرة للاهتمام التي نراها هنا؟

أولاً: تُستخدم CTE (تعبيرات الجدول الشائعة) لتنظيم وفهم التعليمات البرمجية التي تحتوي على العديد من التحويلات ومنطق الأعمال

. ثانيًا: رمز النموذج هو مزيج من لغة SQL ولغة جينجا (لغة نموذجية ).

في المثال ، تم استخدام حلقة for لتكوين المبلغ لكل طريقة دفع محددة في تعبير المجموعة . يتم استخدام وظيفة المرجع أيضًا - القدرة على الرجوع داخل الكود إلى نماذج أخرى:

  • في وقت الترجمة ، سيتم تحويل المرجع إلى مؤشر هدف إلى جدول أو طريقة عرض في المستودع
  • يسمح لك المرجع بإنشاء رسم بياني لتبعيات النموذج

إنه Jinja الذي يضيف إمكانيات غير محدودة تقريبًا إلى DBT. الأكثر استخدامًا:

  • عبارات If / else - عبارات متفرعة
  • للحلقات - الحلقات
  • المتغيرات - المتغيرات
  • ؛ Macro - إنشاء وحدات الماكرو

التجسيد: جدول ، عرض ، تزايدي


استراتيجية التجسيد - نهج يتم بموجبه تخزين مجموعة البيانات النموذجية الناتجة في المستودع.

في الاعتبار الأساسي ، هذا هو:

  • الجدول - الجدول الفعلي في التخزين
  • عرض - عرض ، جدول افتراضي في المستودع

هناك استراتيجيات تجسيد أكثر تعقيدًا:

  • تزايدي - تحميل تدريجي (جداول حقائق كبيرة) ؛ يتم إضافة خطوط جديدة ، يتم تحديث الخطوط المعدلة ، يتم مسح الخطوط المحذوفة 
  • سريع الزوال - لا يتحقق النموذج بشكل مباشر ، ولكنه يشارك مثل CTE في النماذج الأخرى
  • أي استراتيجيات أخرى يمكنك إضافتها بنفسك

بالإضافة إلى استراتيجيات التجسيد ، يتم فتح الفرص لتحسين مستودعات محددة ، على سبيل المثال:

  • ندفة الثلج : جداول عابرة ، سلوك الدمج ، تجميع الجداول ، نسخ المنح ، طرق عرض آمنة
  • الانزياح الأحمر : Distkey ، Sortkey (معشق ، مركب) ، طرق عرض الربط المتأخرة
  • BigQuery : تقسيم الجدول وتجميعه ، ودمج السلوك ، وتشفير KMS ، والعلامات والعلامات
  • Spark : تنسيق الملف (الباركيه ، csv ، json ، orc ، delta) ، التقسيم_بواسطة ، clustered_by ، المجموعات ، تزايدي_الاستراتيجية

المستودعات التالية مدعومة حاليا:

  • Postgres
  • الانزياح الأحمر
  • Bigquery
  • ندفة الثلج
  • المعزوفة (جزئيًا)
  • شرارة (جزئيا)
  • Microsoft SQL Server (محول المجتمع)

دعونا تحسين نموذجنا:

  • جعل حشوها تزايدي (تزايدي)
  • أضف التقسيم وفرز المفاتيح لـ Redshift

--  : 
--  ,      (unique_key)
--   (dist),   (sort)
{{
  config(
       materialized='incremental',
       unique_key='order_id',
       dist="customer_id",
       sort="order_date"
   )
}}
 
{% set payment_methods = ['credit_card', 'coupon', 'bank_transfer', 'gift_card'] %}
 
with orders as (
 
   select * from {{ ref('stg_orders') }}
   where 1=1
   {% if is_incremental() -%}
       --        
       and order_date >= (select max(order_date) from {{ this }})
   {%- endif %} 
 
),
 
order_payments as (
 
   select * from {{ ref('order_payments') }}
 
),
 
final as (
 
   select
       orders.order_id,
       orders.customer_id,
       orders.order_date,
       orders.status,
       {% for payment_method in payment_methods -%}
       order_payments.{{payment_method}}_amount,
       {% endfor -%}
       order_payments.total_amount as amount
   from orders
       left join order_payments using (order_id)
 
)
 
select * from final

الرسم البياني على التبعية النموذجية


إنه شجرة تبعيات. وهو DAG (الرسم البياني الحلقي الموجه - الرسم البياني الحلقي الاتجاهي).

يبني DBT رسمًا بيانيًا استنادًا إلى تكوين جميع نماذج المشروع ، أو بالأحرى مرجع () الروابط داخل النماذج إلى نماذج أخرى. يتيح لك وجود رسم بياني القيام بالأشياء التالية:

  • تشغيل النماذج بالتسلسل الصحيح
  • موازاة تضميد النوافذ
  • تشغيل مخطط فرعي تعسفي 

مثال على الرسم البياني:


كل عقدة في الرسم البياني هي نموذج ، يتم إعطاء حواف الرسم البياني بواسطة التعبير ref.

جودة البيانات والتوثيق


بالإضافة إلى تشكيل النماذج نفسها ، يسمح لك DBT باختبار عدد من التأكيدات حول مجموعة البيانات الناتجة ، مثل:

  • غير فارغة
  • فريد
  • التكامل المرجعي - التكامل المرجعي (على سبيل المثال ، customer_id في جدول الطلبات يقابل المعرف في جدول العملاء)
  • مطابقة قائمة صالحة

يمكنك إضافة اختباراتك الخاصة (اختبارات البيانات المخصصة) ، على سبيل المثال ،٪ انحراف العائد مع مؤشرات في اليوم أو الأسبوع أو الشهر الماضي. أي افتراض يتم صياغته كاستعلام SQL يمكن أن يكون اختبارًا.

بهذه الطريقة ، يمكن اكتشاف الانحرافات والأخطاء غير المرغوب فيها في البيانات في واجهة التخزين.

من حيث التوثيق ، يوفر DBT آليات لإضافة البيانات الوصفية والتعليقات وإصدارها وتوزيعها على مستوى النموذج وحتى السمات. 

إليك كيفية ظهور الاختبارات والوثائق على مستوى ملف التكوين:

 - name: fct_orders
   description: This table has basic information about orders, as well as some derived facts based on payments
   columns:
     - name: order_id
       tests:
         - unique #    
         - not_null #    null
       description: This is a unique identifier for an order
     - name: customer_id
       description: Foreign key to the customers table
       tests:
         - not_null
         - relationships: #   
             to: ref('dim_customers')
             field: customer_id
     - name: order_date
       description: Date (UTC) that the order was placed
     - name: status
       description: '{{ doc("orders_status") }}'
       tests:
         - accepted_values: #    
             values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']

وإليك كيف تبدو هذه الوثائق بالفعل على موقع الويب الذي تم إنشاؤه:


وحدات الماكرو والوحدات


ليس الغرض من DBT كثيرًا أن تصبح مجموعة من نصوص SQL ، ولكن لتزويد المستخدمين بأدوات قوية وغنية بالميزات لبناء التحولات الخاصة بهم وتوزيع هذه الوحدات.

وحدات الماكرو هي مجموعات من البنيات والتعبيرات التي يمكن تسميتها كوظائف داخل النماذج. تسمح لك وحدات الماكرو بإعادة استخدام SQL بين النماذج والمشاريع وفقًا لمبدأ الهندسة DRY (لا تكرر نفسك).

مثال ماكرو:

{% macro rename_category(column_name) %}
case
 when {{ column_name }} ilike  '%osx%' then 'osx'
 when {{ column_name }} ilike  '%android%' then 'android'
 when {{ column_name }} ilike  '%ios%' then 'ios'
 else 'other'
end as renamed_product
{% endmacro %}

واستخدامها:

{% set column_name = 'product' %}
select
 product,
 {{ rename_category(column_name) }} --  
from my_table

يأتي DBT مع مدير الحزم الذي يسمح للمستخدمين بنشر وحدات الماكرو ووحدات الماكرو الفردية وإعادة استخدامها.

وهذا يعني القدرة على تنزيل المكتبات واستخدامها مثل:

  • dbt_utils : العمل مع التاريخ / الوقت والمفاتيح البديلة واختبارات المخطط و Pivot / Unpivot وغيرها
  • قوالب عرض جاهزة للخدمات مثل Snowplow و Stripe 
  • مكتبات لمستودعات البيانات المحددة ، مثل Redshift 
  • التسجيل - وحدة تسجيل DBT

تتوفر قائمة كاملة بالحزم في مركز dbt .

المزيد من الميزات


سأصف هنا العديد من الميزات والتطبيقات الأخرى المثيرة للاهتمام التي أستخدمها أنا والفريق لبناء مستودع بيانات في Wheely .

فصل بيئات وقت التشغيل DEV - TEST - PROD


حتى داخل نفس مجموعة DWH (ضمن مخططات مختلفة). على سبيل المثال ، باستخدام التعبير التالي:

with source as (
 
   select * from {{ source('salesforce', 'users') }}
   where 1=1
   {%- if target.name in ['dev', 'test', 'ci'] -%}           
       where timestamp >= dateadd(day, -3, current_date)   
   {%- endif -%}
 
)

يقول هذا الرمز حرفياً: بالنسبة لبيئات التطوير والاختبار وبيئة ci ، خذ البيانات فقط للأيام الثلاثة الأخيرة وليس أكثر. أي أن التشغيل في هذه البيئات سيكون أسرع بكثير وسيتطلب موارد أقل. عند إطلاقه في بيئة إنتاجية ، سيتم تجاهل شرط الفلتر.

ترميز العمود البديل تجسيد


Redshift عبارة عن عمود DBMS يسمح لك بتحديد خوارزميات ضغط البيانات لكل عمود على حدة. يمكن أن يؤدي اختيار الخوارزميات المثلى إلى تقليل مساحة القرص المشغول بنسبة 20-50٪.

سيقوم الماكرو redshift.compress_table بتنفيذ أمر ANALYZE COMPRESSION ، وإنشاء جدول جديد باستخدام خوارزميات ترميز الأعمدة الموصى بها والمشار إليها بمفاتيح التجزئة (dist_key) و sort_key (sort_key) ، ونقل البيانات إليه ، وحذف النسخة القديمة إذا لزم الأمر.

توقيع الماكرو:

{{ compress_table(schema, table,
                 drop_backup=False,
                 comprows=none|Integer,
                 sort_style=none|compound|interleaved,
                 sort_keys=none|List<String>,
                 dist_style=none|all|even,
                 dist_key=none|String) }}

يبدأ نموذج التسجيل


لكل تنفيذ للنموذج ، يمكنك تعليق الخطافات التي سيتم تنفيذها قبل الإطلاق أو مباشرة بعد إنشاء النموذج:

   pre-hook: "{{ logging.log_model_start_event() }}"
   post-hook: "{{ logging.log_model_end_event() }}"

ستسمح لك وحدة التسجيل بتسجيل جميع البيانات الوصفية اللازمة في جدول منفصل ، والتي يمكنك من خلالها مراجعة وتحليل مجالات المشكلة (الاختناقات).

إليك ما تبدو عليه لوحة التحكم الرئيسية في بيانات البحث في Looker:


أتمتة التخزين


إذا كنت تستخدم بعض ملحقات وظائف التخزين المستخدمة ، مثل UDF (الوظائف المعرفة من قبل المستخدم) ، فإن إصدار هذه الوظائف ، والتحكم في الوصول ، وطرح الإصدارات الجديدة تلقائيًا يكون ملائمًا جدًا للتنفيذ في DBT.

نستخدم UDF في Python لحساب قيم التجزئة ، ومجالات مجال البريد ، وفك تشفير قناع البت.

مثال الماكرو الذي ينشئ UDF في أي وقت تشغيل (dev ، test ، prod):

{% macro create_udf() -%}
 
 {% set sql %}
       CREATE OR REPLACE FUNCTION {{ target.schema }}.f_sha256(mes "varchar")
           RETURNS varchar
           LANGUAGE plpythonu
           STABLE
       AS $$  
           import hashlib
           return hashlib.sha256(mes).hexdigest()
       $$
       ;
 {% endset %}
  
 {% set table = run_query(sql) %}
 
{%- endmacro %}

في Wheely ، نستخدم Amazon Redshift ، الذي يعتمد على PostgreSQL. بالنسبة إلى Redshift ، من المهم جمع الإحصائيات بشكل منتظم حول الجداول وتحرير مساحة على القرص - الأمران ANALYZE و VACUUM ، على التوالي.

للقيام بذلك ، يتم تنفيذ الأوامر من الماكرو redshift_maintenance كل ليلة:

{% macro redshift_maintenance() %}
 
   {% set vacuumable_tables=run_query(vacuumable_tables_sql) %}
 
   {% for row in vacuumable_tables %}
       {% set message_prefix=loop.index ~ " of " ~ loop.length %}
 
       {%- set relation_to_vacuum = adapter.get_relation(
                                               database=row['table_database'],
                                               schema=row['table_schema'],
                                               identifier=row['table_name']
                                   ) -%}
       {% do run_query("commit") %}
 
       {% if relation_to_vacuum %}
           {% set start=modules.datetime.datetime.now() %}
           {{ dbt_utils.log_info(message_prefix ~ " Vacuuming " ~ relation_to_vacuum) }}
           {% do run_query("VACUUM " ~ relation_to_vacuum ~ " BOOST") %}
           {{ dbt_utils.log_info(message_prefix ~ " Analyzing " ~ relation_to_vacuum) }}
           {% do run_query("ANALYZE " ~ relation_to_vacuum) %}
           {% set end=modules.datetime.datetime.now() %}
           {% set total_seconds = (end - start).total_seconds() | round(2)  %}
           {{ dbt_utils.log_info(message_prefix ~ " Finished " ~ relation_to_vacuum ~ " in " ~ total_seconds ~ "s") }}
       {% else %}
           {{ dbt_utils.log_info(message_prefix ~ ' Skipping relation "' ~ row.values() | join ('"."') ~ '" as it does not exist') }}
       {% endif %}
 
   {% endfor %}
 
{% endmacro %}

DBT Cloud


من الممكن استخدام DBT كخدمة (الخدمة المدارة). في مجموعة:

  • Web IDE لتطوير المشاريع والنماذج
  • تكوين الوظيفة وتحديد الجدول الزمني
  • وصول بسيط ومريح للسجلات
  • موقع على شبكة الإنترنت مع توثيق مشروعك
  • اتصال CI (التكامل المستمر)


استنتاج


الطهي واستهلاك DWH ممتعة ومفيدة مثل شرب العصائر. يتكون DBT من Jinja ، الامتدادات المخصصة (الوحدات) ، المترجم ، المحرك (المنفذ) ومدير الحزم. بعد جمع هذه العناصر معًا ، تحصل على بيئة عمل كاملة لمستودع البيانات الخاص بك. بالكاد توجد طريقة أفضل لإدارة التحولات داخل DWH اليوم.



تصاغ المعتقدات التي يتبعها مطورو DBT على النحو التالي:

  • الكود ، وليس GUI ، هو أفضل تجريد للتعبير عن المنطق التحليلي المعقد
  • يجب أن يتكيف العمل مع البيانات مع أفضل ممارسات تطوير البرمجيات (هندسة البرمجيات)

  • يجب التحكم في البنية التحتية الحيوية للبيانات من قبل مجتمع المستخدمين كبرنامج مفتوح المصدر
  • ليس فقط أدوات التحليلات ، ولكن الكود سيصبح بشكل متزايد جزءًا من مجتمع المصدر المفتوح.

ولدت هذه المعتقدات الأساسية منتجًا تستخدمه اليوم أكثر من 850 شركة ، وتشكل أساسًا للعديد من الامتدادات المثيرة للاهتمام التي سيتم إنشاؤها في المستقبل.

بالنسبة لأولئك المهتمين ، هناك مقطع فيديو لدرس مفتوح قضيته قبل بضعة أشهر كجزء من درس مفتوح في OTUS - أداة بناء البيانات لمستودع Amazon Redshift .

بالإضافة إلى DBT ومستودعات البيانات ، كجزء من دورة مهندس البيانات على منصة OTUS ، أقوم أنا وزملائي بإجراء دروس حول عدد من الموضوعات الأخرى ذات الصلة والحديثة:

  • المفاهيم المعمارية لتطبيقات البيانات الضخمة
  • تدرب مع Spark و Spark Streaming
  • طرق وأدوات التعلم لتحميل مصادر البيانات
  • بناء واجهات تحليلية في DWH
  • NoSQL: HBase, Cassandra, ElasticSearch
  •  
  • :

:


  1. DBT documentation — Introduction
  2. What, exactly, is dbt? — DBT 
  3. Data Build Tool Amazon Redshift — YouTube, OTUS
  4. Greenplum — 15 2020
  5. Data Engineering — OTUS
  6. Building a Mature Analytics Workflow
  7. It’s time for open source analytics — Open Source
  8. Continuous Integration and Automated Build Testing with dbtCloud — CI DBT
  9. Getting started with DBT tutorial — ,
  10. Jaffle shop — Github DBT Tutorial — Github,




.



All Articles