Apache Airflow ရှိ အီးမေးလ်မှ ဒေတာရယူရန်အတွက် ETL လုပ်ငန်းစဉ်

Apache Airflow ရှိ အီးမေးလ်မှ ဒေတာရယူရန်အတွက် ETL လုပ်ငန်းစဉ်

နည်းပညာတွေ ဘယ်လောက်ပဲတိုးတက်နေပါစေ ခေတ်မမီတော့တဲ့ ချဉ်းကပ်နည်းတွေက ဖွံ့ဖြိုးတိုးတက်မှုနောက်ကို အမြဲလိုက်နေပါတယ်။ ၎င်းသည် ချောမွေ့သော အကူးအပြောင်း၊ လူ့အချက်များ၊ နည်းပညာလိုအပ်ချက်များ၊ သို့မဟုတ် အခြားတစ်ခုခုကြောင့် ဖြစ်နိုင်သည်။ ဒေတာလုပ်ဆောင်ခြင်းနယ်ပယ်တွင်၊ ဒေတာရင်းမြစ်များသည် ဤအပိုင်းတွင် အထင်ရှားဆုံးဖြစ်သည်။ ဒါကို ဖယ်ရှားပစ်ဖို့ ဘယ်လောက်ပဲ စိတ်ကူးယဉ်နေပါစေ၊ ဒါပေမယ့် အခုအချိန်အထိ ဒေတာရဲ့ တစ်စိတ်တစ်ပိုင်းကို instant messengers နဲ့ email တွေကနေ ပေးပို့ထားပြီး ဟောင်းနွမ်းနေတဲ့ ဖော်မတ်တွေကို မဖော်ပြထားပါဘူး။ Apache Airflow အတွက် ရွေးချယ်စရာများထဲမှ တစ်ခုကို ဖြုတ်ပြီး အီးမေးလ်များမှ ဒေတာကို သင်မည်သို့ ယူနိုင်ပုံကို သရုပ်ဖော်ရန် သင့်ကို ဖိတ်ခေါ်ပါသည်။

စောပိုငျးကာလ

ဒေတာအများအပြားကို e-mail မှတစ်ဆင့်၊ လူအချင်းချင်းဆက်သွယ်မှုမှ ကုမ္ပဏီများကြား အပြန်အလှန်ဆက်ဆံမှုစံနှုန်းများအထိ လွှဲပြောင်းပေးနေဆဲဖြစ်သည်။ ဒေတာရယူရန် အင်တာဖေ့စ်ကို ရေးနိုင်လျှင် သို့မဟုတ် ဤအချက်အလက်များကို ပိုမိုအဆင်ပြေသော အရင်းအမြစ်များထဲသို့ ထည့်မည့်သူများ ရုံးတွင် ထည့်ထားလျှင် ကောင်းသော်လည်း မကြာခဏ မဖြစ်နိုင်ပါ။ ကျွန်တော်ရင်ဆိုင်ခဲ့ရတဲ့ တိကျတဲ့တာဝန်က နာမည်ဆိုးနဲ့ကျော်ကြားတဲ့ CRM စနစ်ကို ဒေတာဂိုဒေါင်နဲ့ ချိတ်ဆက်ပြီး OLAP စနစ်နဲ့ ချိတ်ဆက်ခြင်းဖြစ်ပါတယ်။ ကျွန်ုပ်တို့၏ကုမ္ပဏီအတွက် ဤစနစ်အသုံးပြုမှုသည် စီးပွားရေးနယ်ပယ်တစ်ခုတွင် အဆင်ပြေသည်ဟု သမိုင်းတွင်ခဲ့သည်။ ထို့ကြောင့်၊ လူတိုင်းသည် ဤတတိယပါတီစနစ်မှ ဒေတာများဖြင့် လည်ပတ်နိုင်စေရန် အမှန်တကယ် ဆန္ဒရှိကြသည်။ ပထမဦးစွာ၊ ဟုတ်ပါတယ်၊ ဖွင့်ထားသော API မှဒေတာရယူရန်ဖြစ်နိုင်ခြေကိုလေ့လာခဲ့သည်။ ကံမကောင်းစွာဖြင့်၊ API သည် လိုအပ်သောဒေတာအားလုံးကို ရယူခြင်းအား မဖုံးကွယ်ထားဘဲ၊ ရိုးရှင်းသောအားဖြင့်၊ ၎င်းသည် နည်းလမ်းများစွာဖြင့် လှည့်စားနေပြီး ပိုမိုပြည့်စုံသောလုပ်ဆောင်နိုင်စွမ်းကိုပေးဆောင်ရန် နည်းပညာပိုင်းဆိုင်ရာပံ့ပိုးမှုမှာ တစ်ဝက်တစ်ပျက်အလိုမရှိ သို့မဟုတ် မပြည့်မီနိုင်ပါ။ သို့သော် ဤစနစ်သည် မှတ်တမ်းဟောင်းကို လွှင့်တင်ရန်အတွက် လင့်ခ်ပုံစံဖြင့် ပျောက်ဆုံးနေသောဒေတာများကို အချိန်အခါအလိုက် လက်ခံရရှိရန် အခွင့်အရေးပေးထားသည်။

လုပ်ငန်းသည် အီးမေးလ်များ သို့မဟုတ် instant messenger များမှ အချက်အလက်စုဆောင်းလိုသည့်တစ်ခုတည်းသောကိစ္စမဟုတ်ကြောင်း သတိပြုသင့်သည်။ သို့သော်လည်း ဤကိစ္စတွင်၊ ဤနည်းဖြင့်သာ ဒေတာတစ်စိတ်တစ်ပိုင်းကို ပံ့ပိုးပေးသည့် ပြင်ပကုမ္ပဏီကို ကျွန်ုပ်တို့ လွှမ်းမိုးနိုင်မည်မဟုတ်ပေ။

apache လေစီးဆင်းမှု

ETL လုပ်ငန်းစဉ်များတည်ဆောက်ရန်အတွက် ကျွန်ုပ်တို့သည် Apache Airflow ကို အများဆုံးအသုံးပြုလေ့ရှိသည်။ ဤနည်းပညာနှင့် မရင်းနှီးသော စာဖတ်သူသည် စကားစပ်ပုံတွင် မည်သို့ပုံသဏ္ဍန်ရှိကြောင်းနှင့် ယေဘုယျအားဖြင့် ပိုမိုကောင်းမွန်စွာ နားလည်နိုင်စေရန်အတွက် နိဒါန်းအချို့ကို ဖော်ပြပါမည်။

Apache Airflow သည် Python ရှိ ETL (Extract-Transform-Loading) လုပ်ငန်းစဉ်များကို တည်ဆောက်ရန်၊ လုပ်ဆောင်ရန်နှင့် စောင့်ကြည့်ရန် အသုံးပြုသည့် အခမဲ့ပလပ်ဖောင်းတစ်ခုဖြစ်သည်။ Airflow ၏ အဓိက အယူအဆမှာ ဂရပ်ဖစ်၏ ထောင့်စွန်းများသည် တိကျသော လုပ်ငန်းစဉ်များဖြစ်ပြီး ဂရပ်၏ အစွန်းများသည် ထိန်းချုပ်မှု သို့မဟုတ် အချက်အလက်များ စီးဆင်းမှုတို့ဖြစ်သည်။ လုပ်ငန်းစဉ်တစ်ခုသည် မည်သည့် Python လုပ်ဆောင်ချက်ကိုမဆို ရိုးရိုးရှင်းရှင်း ခေါ်ဆိုနိုင်သည်၊ သို့မဟုတ် အတန်းတစ်ခု၏ ဆက်စပ်မှုတွင် လုပ်ဆောင်ချက်များစွာကို စဉ်ဆက်မပြတ်ခေါ်ဆိုခြင်းမှ ပိုမိုရှုပ်ထွေးသော ယုတ္တိဗေဒများ ရှိနိုင်သည်။ မကြာခဏဆိုသလို လုပ်ဆောင်မှုများအတွက်၊ လုပ်ငန်းစဉ်များအဖြစ် အသုံးပြုနိုင်သည့် အဆင်သင့်လုပ်ထားသော တိုးတက်မှုများစွာ ရှိနှင့်ပြီးဖြစ်သည်။ ထိုကဲ့သို့သောတိုးတက်မှုများပါဝင်သည်-

  • အော်ပရေတာများ - တစ်နေရာမှတစ်နေရာသို့ဒေတာလွှဲပြောင်းခြင်းအတွက်ဥပမာ၊ ဒေတာဘေ့စ်ဇယားမှဒေတာဂိုဒေါင်သို့၊
  • အာရုံခံကိရိယာများ - အချို့သောဖြစ်ရပ်တစ်ခုဖြစ်ပွားမှုကို စောင့်ဆိုင်းရန်နှင့် ဂရပ်၏နောက်ဆက်တွဲ ဒေါင်လိုက်များဆီသို့ ထိန်းချုပ်စီးဆင်းမှုကို ညွှန်ကြားခြင်း၊
  • ချိတ်များ - ဥပမာအားဖြင့်၊ ဒေတာဘေ့စ်ဇယား (ထုတ်ပြန်ချက်များတွင်သုံးသည်) မှဒေတာရယူရန်၊
  • စသည်တို့ကို

ဤဆောင်းပါးတွင် Apache Airflow ကို အသေးစိတ်ဖော်ပြရန် မသင့်လျော်ပါ။ မိတ်ဆက်အကျဉ်းချုပ်ကို ကြည့်ရှုနိုင်ပါသည်။ ဒီမှာ သို့မဟုတ် ဒီမှာ.

ဒေတာရယူရန်အတွက် ချိတ်ပါ။

ပထမဦးစွာ၊ ပြဿနာကိုဖြေရှင်းရန်၊ ကျွန်ုပ်တို့လုပ်နိုင်သောချိတ်တစ်ခုရေးရန်လိုအပ်သည်။

  • အီးမေးလ်သို့ ချိတ်ဆက်ပါ။
  • မှန်ကန်သောစာလုံးကိုရှာပါ။
  • စာထဲက data ကိုလက်ခံတယ်။

from airflow.hooks.base_hook import BaseHook
import imaplib
import logging

class IMAPHook(BaseHook):
    def __init__(self, imap_conn_id):
        """
           IMAP hook для получения данных с электронной почты

           :param imap_conn_id:       Идентификатор подключения к почте
           :type imap_conn_id:        string
        """
        self.connection = self.get_connection(imap_conn_id)
        self.mail = None

    def authenticate(self):
        """ 
            Подключаемся к почте
        """
        mail = imaplib.IMAP4_SSL(self.connection.host)
        response, detail = mail.login(user=self.connection.login, password=self.connection.password)
        if response != "OK":
            raise AirflowException("Sign in failed")
        else:
            self.mail = mail

    def get_last_mail(self, check_seen=True, box="INBOX", condition="(UNSEEN)"):
        """
            Метод для получения идентификатора последнего письма, 
            удовлетвораяющего условиям поиска

            :param check_seen:      Отмечать последнее письмо как прочитанное
            :type check_seen:       bool
            :param box:             Наименования ящика
            :type box:              string
            :param condition:       Условия поиска писем
            :type condition:        string
        """
        self.authenticate()
        self.mail.select(mailbox=box)
        response, data = self.mail.search(None, condition)
        mail_ids = data[0].split()
        logging.info("В ящике найдены следующие письма: " + str(mail_ids))

        if not mail_ids:
            logging.info("Не найдено новых писем")
            return None

        mail_id = mail_ids[0]

        # если таких писем несколько
        if len(mail_ids) > 1:
            # отмечаем остальные прочитанными
            for id in mail_ids:
                self.mail.store(id, "+FLAGS", "\Seen")

            # возвращаем последнее
            mail_id = mail_ids[-1]

        # нужно ли отметить последнее прочитанным
        if not check_seen:
            self.mail.store(mail_id, "-FLAGS", "\Seen")

        return mail_id

ယုတ္တိဗေဒသည် ဤအရာဖြစ်သည်- ကျွန်ုပ်တို့ ချိတ်ဆက်ပါ၊ နောက်ဆုံး အသက်ဆိုင်ဆုံး စာလုံးကို ရှာပါ၊ အခြားသူများရှိပါက ၎င်းတို့ကို ကျွန်ုပ်တို့ လျစ်လျူရှုပါ။ နောက်ပိုင်း စာလုံးများတွင် အစောပိုင်း ဒေတာများ ပါ၀င်သောကြောင့် ဤလုပ်ဆောင်ချက်ကို အသုံးပြုပါသည်။ ဒီလိုမှမဟုတ်ရင် စာလုံးအားလုံးရဲ့ array တစ်ခုကို ပြန်ပေးလို့ရတယ်၊ ဒါမှမဟုတ် ပထမတစ်ခုကို စီမံဆောင်ရွက်ပြီး ကျန်ကို နောက် pass မှာ ပြန်ပေးနိုင်ပါတယ်။ ယေဘူယျအားဖြင့် အရာရာတိုင်းဟာ အလုပ်အပေါ်မှာပဲ မူတည်ပါတယ်။

ချိတ်တွင် အရန်လုပ်ဆောင်ချက် နှစ်ခုကို ပေါင်းထည့်သည်- ဖိုင်တစ်ခုကို ဒေါင်းလုဒ်လုပ်ရန်နှင့် အီးမေးလ်မှ လင့်ခ်ကို အသုံးပြု၍ ဖိုင်တစ်ခုကို ဒေါင်းလုဒ်လုပ်ရန်အတွက် ဖြစ်သည်။ စကားမစပ်၊ ၎င်းတို့ကို အော်ပရေတာသို့ ရွှေ့ပြောင်းနိုင်သည်၊ ၎င်းသည် ဤလုပ်ဆောင်နိုင်စွမ်းကို အသုံးပြုသည့် အကြိမ်ရေပေါ်မူတည်သည်။ အချိတ်တွင် ထပ်ထည့်ရမည့်အရာသည် အလုပ်အပေါ်တွင်မူတည်သည်- အကယ်၍ ဖိုင်များကို စာကိုချက်ချင်းလက်ခံရရှိပါက၊ သင်စာတွင် ပူးတွဲပါဖိုင်များကို ဒေါင်းလုဒ်လုပ်နိုင်သည်၊ အကယ်၍ စာထဲတွင် ဒေတာရရှိပါက၊ စာကို ခွဲခြမ်းစိတ်ဖြာရန် လိုအပ်ပါသည်။ စသည်တို့ ကျွန်ုပ်၏ကိစ္စတွင်၊ ကျွန်ုပ်သည် တစ်နေရာရာ၌ ထားရန်လိုအပ်ပြီး နောက်ထပ်လုပ်ဆောင်မှု လုပ်ငန်းစဉ်ကို စတင်ရန် လိုအပ်သည့် မော်ကွန်းသို့ လင့်ခ်တစ်ခုပါရှိသည့် စာကို ပေးပို့ပါသည်။

    def download_from_url(self, url, path, chunk_size=128):
        """
            Метод для скачивания файла

            :param url:              Адрес загрузки
            :type url:               string
            :param path:             Куда положить файл
            :type path:              string
            :param chunk_size:       По сколько байтов писать
            :type chunk_size:        int
        """
        r = requests.get(url, stream=True)
        with open(path, "wb") as fd:
            for chunk in r.iter_content(chunk_size=chunk_size):
                fd.write(chunk)

    def download_mail_href_attachment(self, mail_id, path):
        """
            Метод для скачивания файла по ссылке из письма

            :param mail_id:         Идентификатор письма
            :type mail_id:          string
            :param path:            Куда положить файл
            :type path:             string
        """
        response, data = self.mail.fetch(mail_id, "(RFC822)")
        raw_email = data[0][1]
        raw_soup = raw_email.decode().replace("r", "").replace("n", "")
        parse_soup = BeautifulSoup(raw_soup, "html.parser")
        link_text = ""

        for a in parse_soup.find_all("a", href=True, text=True):
            link_text = a["href"]

        self.download_from_url(link_text, path)

ကုဒ်သည် ရိုးရှင်းသောကြောင့် နောက်ထပ်ရှင်းပြရန် မလိုအပ်ပါ။ မှော်လိုင်း imap_conn_id အကြောင်း ပြောပြမယ်။ Apache Airflow သည် string identifier မှဝင်ရောက်နိုင်သည့်ချိတ်ဆက်မှုဘောင်များ (အကောင့်ဝင်ရန်၊ စကားဝှက်၊ လိပ်စာနှင့် အခြားကန့်သတ်ချက်များ) ကို သိမ်းဆည်းထားသည်။ အမြင်အားဖြင့်၊ ချိတ်ဆက်မှုစီမံခန့်ခွဲမှုသည် ဤကဲ့သို့ဖြစ်သည်။

Apache Airflow ရှိ အီးမေးလ်မှ ဒေတာရယူရန်အတွက် ETL လုပ်ငန်းစဉ်

ဒေတာကိုစောင့်ဆိုင်းရန်အာရုံခံကိရိယာ

မေးလ်မှ ဒေတာကို ချိတ်ဆက်ပုံနှင့် လက်ခံနည်းကို ကျွန်ုပ်တို့ သိထားပြီးဖြစ်သောကြောင့် ၎င်းတို့ကို စောင့်ဆိုင်းရန် အာရုံခံကိရိယာတစ်ခု ရေးသားနိုင်ပါပြီ။ ကျွန်တော့်ကိစ္စတွင်၊ ဒေတာကို စီမံဆောင်ရွက်ပေးမည့် အော်ပရေတာတစ်ခုအား ချက်ချင်းရေးသားခြင်းသည် အလုပ်မဖြစ်ပါ၊ အကြောင်းမှာ၊ အကြောင်းမှာ၊ အခြားသော အရင်းအမြစ်များမှ ဆက်စပ်အချက်အလက်များကို ယူဆောင်သည့် mail မှရရှိသောဒေတာအပေါ်အခြေခံ၍ အခြားလုပ်ငန်းစဉ်များလုပ်ဆောင်သောကြောင့် (API၊ တယ်လီဖုန်း၊ ဝဘ်မက်ထရစ်များ စသည်ဖြင့်) စသည်ဖြင့်)။ ဥပမာတစ်ခုပေးမယ်။ အသုံးပြုသူအသစ်သည် CRM စနစ်တွင် ပေါ်လာပြီး ၎င်း၏ UUID အကြောင်း ကျွန်ုပ်တို့ မသိရှိသေးပါ။ ထို့နောက်၊ SIP တယ်လီဖုန်းမှ ဒေတာကို လက်ခံရယူရန် ကြိုးစားသောအခါ၊ ကျွန်ုပ်တို့သည် ၎င်း၏ UUID နှင့် ချိတ်ဆက်ထားသော ခေါ်ဆိုမှုများကို လက်ခံရရှိမည်ဖြစ်ပြီး ၎င်းတို့ကို သိမ်းဆည်းပြီး မှန်ကန်စွာ အသုံးပြုနိုင်မည်မဟုတ်ပါ။ ထိုသို့သောကိစ္စများတွင်၊ အထူးသဖြင့် ၎င်းတို့သည် မတူညီသောရင်းမြစ်များမှ ဒေတာများ၏ မှီခိုမှုကို သတိပြုရန် အရေးကြီးသည်။ ဤအရာများသည် ဒေတာခိုင်မာမှုကို ထိန်းသိမ်းရန် လုံလောက်သော အစီအမံများ မလုံလောက်သော်လည်း အချို့ကိစ္စများတွင် လိုအပ်ပါသည်။ ဟုတ်သည်၊ အရင်းအမြစ်များကို သိမ်းပိုက်ရန် ပျင်းရိခြင်းသည်လည်း အသုံးမကျပါ။

ထို့ကြောင့်၊ ကျွန်ုပ်တို့၏အာရုံခံကိရိယာသည် မေးလ်ထဲတွင် လတ်ဆတ်သောအချက်အလက်များရှိပါက ဂရပ်၏နောက်ဆက်တွဲများကို လွှင့်တင်မည်ဖြစ်ပြီး ယခင်အချက်အလက်များကိုလည်း မသက်ဆိုင်ကြောင်း အမှတ်အသားပြုပါမည်။

from airflow.sensors.base_sensor_operator import BaseSensorOperator
from airflow.utils.decorators import apply_defaults
from my_plugin.hooks.imap_hook import IMAPHook

class MailSensor(BaseSensorOperator):
    @apply_defaults
    def __init__(self, conn_id, check_seen=True, box="Inbox", condition="(UNSEEN)", *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.conn_id = conn_id
        self.check_seen = check_seen
        self.box = box
        self.condition = condition

    def poke(self, context):
        conn = IMAPHook(self.conn_id)
        mail_id = conn.get_last_mail(check_seen=self.check_seen, box=self.box, condition=self.condition)

        if mail_id is None:
            return False
        else:
            return True

ကျွန်ုပ်တို့သည် ဒေတာကို လက်ခံပြီး အသုံးပြုပါသည်။

ဒေတာလက်ခံခြင်းနှင့် စီမံဆောင်ရွက်ရန်အတွက် သီးခြားအော်ပရေတာတစ်ခု ရေးသားနိုင်ပြီး အသင့်လုပ်ထားသော စက်များကို အသုံးပြုနိုင်သည်။ ယခုအချိန်အထိ ယုတ္တိဗေဒသည် အသေးအဖွဲဖြစ်သောကြောင့် - ဥပမာအားဖြင့်၊ ကျွန်ုပ်သည် စံ PythonOperator ကို အကြံပြုပါသည်။

from airflow.models import DAG

from airflow.operators.python_operator import PythonOperator
from airflow.sensors.my_plugin import MailSensor
from my_plugin.hooks.imap_hook import IMAPHook

start_date = datetime(2020, 4, 4)

# Стандартное конфигурирование графа
args = {
    "owner": "example",
    "start_date": start_date,
    "email": ["[email protected]"],
    "email_on_failure": False,
    "email_on_retry": False,
    "retry_delay": timedelta(minutes=15),
    "provide_context": False,
}

dag = DAG(
    dag_id="test_etl",
    default_args=args,
    schedule_interval="@hourly",
)

# Определяем сенсор
mail_check_sensor = MailSensor(
    task_id="check_new_emails",
    poke_interval=10,
    conn_id="mail_conn_id",
    timeout=10,
    soft_fail=True,
    box="my_box",
    dag=dag,
    mode="poke",
)

# Функция для получения данных из письма
def prepare_mail():
    imap_hook = IMAPHook("mail_conn_id")
    mail_id = imap_hook.get_last_mail(check_seen=True, box="my_box")
    if mail_id is None:
        raise AirflowException("Empty mailbox")

    conn.download_mail_href_attachment(mail_id, "./path.zip")

prepare_mail_data = PythonOperator(task_id="prepare_mail_data", default_args=args, dag=dag, python_callable= prepare_mail)

# Описание остальных вершин графа
...

# Задаем связь на графе
mail_check_sensor >> prepare_mail_data
prepare_data >> ...
# Описание остальных потоков управления

စကားမစပ်၊ သင်၏ကော်ပိုရိတ်မေးလ်သည် mail.ru တွင်ရှိနေပါက၊ ဘာသာရပ်၊ ပေးပို့သူစသည်ဖြင့် စာလုံးများကို သင်ရှာဖွေနိုင်မည်မဟုတ်ပါ။ 2016 တုန်းက မိတ်ဆက်မယ်လို့ ကတိပေးခဲ့ပေမယ့် စိတ်ပြောင်းသွားပုံရပါတယ်။ လိုအပ်သောစာလုံးများအတွက် သီးခြားဖိုင်တွဲတစ်ခုဖန်တီးပြီး မေးလ်ဝဘ်အင်တာဖေ့စ်တွင် လိုအပ်သောစာလုံးများအတွက် စစ်ထုတ်မှုတစ်ခုထည့်သွင်းခြင်းဖြင့် ဤပြဿနာကို ဖြေရှင်းခဲ့သည်။ ထို့ကြောင့် ရှာဖွေရန် လိုအပ်သော စာလုံးများနှင့် အခြေအနေများကိုသာ ကျွန်ုပ်ကိစ္စတွင်၊ ရိုးရိုးရှင်းရှင်း (UNSEEN) ဤဖိုဒါထဲသို့ ရောက်သွားပါသည်။

အနှစ်ချုပ်အားဖြင့်၊ ကျွန်ုပ်တို့တွင် အောက်ပါအစီအစဥ်များ ရှိသည်- အခြေအနေများနှင့် ကိုက်ညီသော စာလုံးအသစ်များ ရှိ၊မရှိ စစ်ဆေးပါ၊ ရှိလျှင် နောက်ဆုံးစာလုံးမှ လင့်ခ်ကို အသုံးပြု၍ မော်ကွန်းကို ဒေါင်းလုဒ်လုပ်ပါ။
နောက်ဆုံးအစက်များအောက်တွင်၊ ဤမှတ်တမ်းကို ထုပ်ပိုးလိုက်မည်ဖြစ်ပြီး၊ မှတ်တမ်းဟောင်းမှဒေတာများကို ရှင်းလင်းပြီး စီမံဆောင်ရွက်မည်ဖြစ်ပြီး ရလဒ်အနေဖြင့်၊ အရာအားလုံးသည် ETL လုပ်ငန်းစဉ်၏ ပိုက်လိုင်းဆီသို့ ပိုမိုရောက်ရှိသွားမည်ဖြစ်ပြီး၊ သို့သော် ၎င်းသည် ကျော်လွန်နေပြီဖြစ်သည်။ ဆောင်းပါး၏နယ်ပယ်။ စိတ်ဝင်စားစရာကောင်းပြီး အသုံးဝင်လာပါက၊ ETL ဖြေရှင်းချက်များနှင့် Apache Airflow အတွက် ၎င်းတို့၏ အစိတ်အပိုင်းများကို ဝမ်းမြောက်စွာ ဆက်လက်ဖော်ပြပါမည်။

source: www.habr.com

မှတ်ချက် Add