Daha çox

Bir lüğət və ya axtarış cədvəlindən istifadə edərək dəyərləri necə dəyişdirə bilərəm?


SearchCursor istifadə edərək verilənlər bazasından satırları (hər sətirdə ~ 20 sahə) oxuyuram və onları bir sıra halına yerləşdirirəm. Sonra massivin üstündən keçib onları fərqli bir verilənlər bazasında bir Xüsusiyyət Sınıfına daxil etmək üçün bir InsertCursor istifadə edirəm.

Problem, mənbə məlumatlarını sahə dəyərlərinə çevirməliyəm. Məsələn, bir sütunda "T", "true", "yes" və "1" simvolları ola bilər və təyinat sütununa yazılmadan əvvəl "TRUE" sətir dəyərinə çevrilməlidir.

  • Mənbə sütununda təyinatdakı tək bir dəyərə uyğunlaşdırılması lazım olan çox sayda dəyər ola bilər. Bu yuxarıdakı nümunədir.
  • Sütun başına birdən çox axtarış ola bilər. Məsələn, bir sütun "Z1" -ə çevrilən "A" -ın mənbə dəyəri ola bilər və eyni sütunda "B" "Z2" -ə çevrilir və yenə də eyni sütunda "C" -ə çevrilir "Z1" (çoxlu mənbə dəyərləri eyni təyinat dəyərinə uyğunlaşdırılır).
  • Axtarışların yaradılmasına ehtiyac olacaq bir çox sütun var. Hər sütun üçün fərqli bir lüğət / axtarış cədvəlinin olmasını istərdim, çünki sütunlar arasında incə fərqlər olacaq və lüğətlərdən yenidən istifadə etməyə çalışmaq əsəbiləşəcəkdir.

Bu problemə necə yanaşmalıyam?


Yeniləmə # 1

@ Mr.adam'ın təkliflərindən istifadə edərək nümunə: Xətaya bir səhv salırəgər axtarışda [key] .lower () (açar [1]):mesajlaTypeError: int obyekti abunə edilə bilməz

axtarış = {3: ("DOĞRU", ["t", "true", "1", "yes"]), 4: ("FALSE", ["f", "false", "0", " yox "])} satır = [] rows.append ((" abc "," 123 "," xyz "," True "," F ")) rows.append ((" lmo "," 456 "," xyz "," 1 "," no ")) rows.append ((" tuv "," 456 "," xyz "," yes "," 0 ")) satır sıralar üçün: key üçün, lookup.iteritems-də dəyər (): əgər sətir [açar] .çiçək () axtarışda (düymə [1]): sətir [açar] = sətirdə satır üçün axtarış (açar [0]): çap sətri

2 nömrəsini yeniləyin

əlavə qazmadan sonra yuxarıdakı istinad xəttini qıraraq,sıra [key] .lower ()qiymətləndirir "doğru"verilənlər bazasında ilk sətrin 4-cü sütunu üçün gözlənildiyi kimi. səhv qiymətləndirilərkən atılırinbu sətrin müddəası,axtarış (açar [1]).


Buna bənzər bir lüğət hazırlayardım:

axtarışlar = {"DOĞRU": ["t", "true", "1", "yes"], "FALSE": ["f", "false", "0", "no"]}

Sonra məntiq belə görünə bilər:

satır sıraları üçün: sıra üçün i üçün (0, len (sıra)): açar üçün, axtarışdakı dəyər.iteritems (): if str (satır [i]). alt () dəyərdə: satır [i] = açar

Bu kod bir anda cədvəlin hamısını sıra ilə yeniləyəcəkdir. Əgər "T" dəyərinin "TRUE" -ə çevrilməli olduğu field1 və "T" -nin "Top" a çevrilməli olduğu field2 varsa, bu problem olar. Əgər belədirsə, lüğəti aşağıdakı kimi dəyişdirə bilərsiniz:

axtarışlar = {fieldindexnumber: ("DOĞRU", ["t", "true", "1", "yes"]), fieldindexnumber: ("FALSE", ["f", "false", "0", " Xeyr "]), fieldindexnumber: (" Naməlum ", [" u "]), # gözlükdəki ikinci obyektin siyahı olduğundan əmin olun []}

Sonra yalnız loop quruluşunu dəyişdirin:

satırdakı sıra üçün: açar üçün, lookup.iteritems-də dəyər (): əgər satır [açar] .lower () dəyərdə [1]: satır [açar] = dəyər [0]

Potensial dəyərlərin hamısını kiçik hərflə düzəltdiyimi və sonra mövcud dəyəri kiçik hərflə yazdığımı unutmayın. Dəfələrlə çox faydalı olduğunu gördüm, ancaq aradığınız olmaya bilər.

Bunu fərqli bir şəkildə həyata keçirmək istəyə bilərsiniz, amma mütləq bu lüğətin bəzi versiyaları ilə getməyinizi tövsiyə edərdim, çünki onu yalnız skriptinizin üstündə saxlaya bilərsiniz və dəyişdirmək istədiyiniz halda açıq şəkildə düzəldiləcəkdir / açar dəyər cütləri əlavə edin.


Təklifim: əvvəlcə lüğətlərin lüğətini yaradın. Valideyn diktəsinin açarları sənin içindəki müxtəlif sahələrin indeks mövqeyi olacaqSearchCursor(@ mr.adam cavabında olduğu kimi). Dəyərlər açarları istənilən çıxış dəyərləri olan və dəyərləri müvafiq açara çevriləcək mümkün girişlərin siyahıları olan alt lüğətlər olacaqdır.

çevirilər = {# 1-ci sahə: 0: {"DOĞRU": ["t", "true", "1", "yes"], "FALSE": ["f", "false", "0", " yox "]}, # 2-ci sahə: 1: {" Z1 ": [" A "," C "]," Z2 ": [" B "]} # və s.)

Sonra yuxarıdakı alt lüğətlərlə eyni formada giriş dəyərini və lüğəti qəbul edən, uyğunluq tapıldıqda çevrilmiş dəyəri və ya dəyişməmiş giriş dəyərini qaytaran ümumi bir tərcümə funksiyasını təyin edin:

def translate (in_value, translation_dict): out_value = in_value for k, v in translation_dict.iteritems (): if out_value in v: out_value = k break return out_value

Və nəhayət, müvafiq tərcümə lüğətini götürmək üçün sahənin indeksindən istifadə edərək hər bir satırdakı hər bir dəyərə bu funksiyanı tətbiq edin:

satırlardakı sıra üçün: xrange içərisində i üçün (len (sıra)): sıra [i] = tərcümə et (sıra [i], tərcümələr [i])

Satırlar daha sonra yenilənəcək və sizin üçün istifadə üçün hazır olacaqInsertCursor.


Bir başqa tövsiyə: satırları yaddaşa kopyalamaq, dəyişdirmək və sonraInsertCursor, Hər şeyi təyyarədə belə edərdim:

arcpy.da.InsertCursor (out_table, [field_list]) ilə ic: arcpy.da.SearchCursor (in_table, [field_list]) ilə sc: sıra üçün sc: i üçün xrange (len (sıra))): sıra [ i] = tərcümə et (sıra [i], tərcümələr [i]) ic.insertRow (sıra)

Qeydlər

Dictionary & ltTKey, TValue & gt generic sinfi bir sıra düymələrdən bir sıra dəyərlərə qədər bir eşleme təmin edir. Lüğətə hər əlavə bir dəyər və əlaqəli açardan ibarətdir. Düyməni istifadə edərək bir dəyər əldə etmək O (1) -ə yaxındır, çünki Dictionary & ltTKey, TValue & gt sinfi hash masa kimi tətbiq olunur.

Alma sürəti TKey üçün göstərilən tipin həşt alqoritminin keyfiyyətindən asılıdır.

Dictionary & ltTKey, TValue & gt-də bir obyekt açar kimi istifadə olunduğu müddətcə, hash dəyərini təsir edəcək bir şəkildə dəyişməməlidir. Dictionary & ltTKey, TValue & gt-dəki hər düymə, lüğətin bərabərlik müqayisəsinə görə unikal olmalıdır. Açar sıfır ola bilməz, ancaq TValue növü bir istinad növüdürsə dəyər ola bilər.

Dictionary & ltTKey, TValue & gt düymələrin bərabər olub olmadığını müəyyən etmək üçün bərabərlik tətbiq edilməsini tələb edir. IEqualityComparer & ltT & gt ümumi interfeysinin bir tətbiqini, bir tətbiqetmə təyin etməsəniz, müqayisə parametrini qəbul edən bir konstruktordan istifadə edərək təyin edə bilərsiniz, standart ümumi bərabərlik müqayisəsi EqualityComparer & ltT & gt.Default istifadə olunur. TKey tipi System.IEquatable & ltT & gt ümumi interfeysini tətbiq edirsə, standart bərabərlik müqayisəsi bu tətbiqdən istifadə edir.

Məsələn, StringComparer sinfi tərəfindən verilən hərflərə həssas olmayan simli müqayisələrdən istifadə edə bilərsiniz, hərflərə həssas olmayan simli düymələr ilə lüğətlər yarada bilərsiniz.

Dictionary & ltTKey, TValue & gt-nin tutumu, Dictionary & ltTKey, TValue & gt-nin tuta biləcəyi elementlərin sayıdır. Lüğətə və ltTKey, TValue & gt-ə elementlər əlavə edildikdə, daxili sıra yenidən bölünərək, tutum tələb olunduğu kimi avtomatik olaraq artır.

.NET Framework yalnız: Çox böyük Dictionary & ltTKey, TValue & gt obyektləri üçün & ltgcAllowVeryLargeObjects & gt konfiqurasiya elementinin işləmə vaxtı mühitində effektiv xüsusiyyətini təyin edərək 64 bitlik sistemdə maksimum tutumu 2 milyard elementə qədər artırmaq olar.

Sayım məqsədləri üçün lüğətdəki hər bir maddə bir dəyəri və açarını təmsil edən KeyValuePair & ltTKey, TValue & gt quruluşu kimi qəbul edilir. Məhsulların geri qaytarılma qaydası təyin olunmamışdır.

C # dilinin əvvəlki ifadəsi (hər biri üçün C ++, hər biri üçün Visual Basic üçün) kolleksiyadakı elementlərin növünə aid bir obyekt qaytarır. Dictionary & ltTKey, TValue & gt düymələr və dəyərlər toplusu olduğundan element növü açarın növü və ya dəyərin növü deyil. Bunun əvəzinə, element növü açar tipin və dəyər növünün KeyValuePair & ltTKey, TValue & gt-dir. Misal üçün:

Əvvəlki deyim sayğacın ətrafındakı bir sarğıdır, yalnız kolleksiyadan oxumağa imkan verir, ona yazmır.

Düymələr miras qala biləcəyi və davranışları dəyişdirilə biləcəyi üçün, Equals metodu ilə müqayisə edərək mütləq unikallığı təmin edilə bilməz.


1 Cavab 1

Lüğətin C # -də necə tətbiq olunduğunu görmək üçün biraz qazmalısınız - HashMap (hash masa) və ya TreeMap (sıralanmış bir ağac) (və ya ConcurrentSkipListMap - atlama siyahısı) qədər aydın deyil.

"Qeydlər" bölməsinə daxil olsanız:

Dictionary ümumi sinfi bir sıra düymələrdən bir sıra dəyərlərə qədər bir eşleme təmin edir. Lüğətə hər əlavə bir dəyər və əlaqəli açardan ibarətdir. Düyməni istifadə edərək bir dəyər əldə etmək O (1) -ə yaxındır, çünki Dictionary sinfi hash cədvəli kimi tətbiq olunur.

Və bizdə var. Bu hash masa. Vikipediya məqaləsini orada əlaqələndirdiyimi unutmayın - kifayət qədər yaxşı oxunur. Çarpışmanın həlli bölməsini oxumaq istəyə bilərsiniz. Axtarışın O (N) -ə keçdiyi bir patoloji məlumat dəsti əldə etmək mümkündür (məsələn, əlavə etdiyiniz hər şey nədənsə hash cədvəlindəki eyni hash dəyərinə və ya indeksə düşür və xətti araşdırma ilə qalırsınız).

Lüğət ümumi məqsədli bir həll olsa da, konkret növlərdən (lüğət kimi) keçməməlisiniz - interfeyslərdən keçməlisiniz. Bu vəziyyətdə həmin interfeys IDictionary (docs) olur. Bunun üçün əlinizdəki məlumatlar üçün ən uyğun şeyləri edən öz lüğət tətbiqinizi yazmağı bacarırsınız.

Müxtəlif axtarışların səmərəliliyinə gəldikdə / ehtiva edir?

  • Çeşidlənməmiş bir siyahıda gəzmək: O (N)
  • Sıralanmış bir sıra ikili axtarış: O (log N)
  • Çeşidlənmiş ağac: O (log N)
  • Hash masası: O (1)

Əksər insanlar üçün hash masa istədikləri şeydir.

SortDictionary əvəzinə istədiyiniz şey olduğunu tapa bilərsiniz:

SortedDictionary & ltTKey, TValue & gt generic sinfi, lüğətdəki elementlərin sayı olduğu O (log n) axtarışı ilə ikili axtarış ağacındadır. Bu baxımdan, SortedList & ltTKey, TValue & gt generic sinifinə bənzəyir. İki sinif oxşar obyekt modellərinə malikdir və hər ikisi də O (log n) axtarışına malikdir.

Yenə də məlumat quruluşu, məlumatlarınızla ideal şəkildə işləyən bir sistem deyilsə, məlumatlarınız üçün ən yaxşısını yazmaq üçün sizə alətlər (interfeyslər) verilir.

Lüğətin özü də mücərrəd bir məlumat növüdür. Mənə bir lüğət verirsən və mən bununla nə edə biləcəyimi və oradakı bütün alətləri lüğət olması ilə istifadə etməyimi bilirəm. Mənə bir ArrayList versəydiniz, siyahıdakı maddələrin axtarışı, daxil edilməsi və ya silinməsi üçün öz kodumu yazdığımı görərdim. Bu vaxtımı boşa keçirir və eyni zamanda kodu ləkədən nöqtəyə təkrar kopyaladığımda bir səhv ehtimalı daha yüksəkdir.


Uzatma metodları

Göstərilən düymə ilə dəyəri lüğətdən çıxartmağa çalışır.

Göstərilən açarı və dəyəri lüğətə əlavə etməyə çalışır.

Göstərilən kolleksiyadan dəyişməz bir sıra yaradır.

Mövcud elementlər kolleksiyasından mənbə açarlarına çevrilmə funksiyası tətbiq edərək dəyişməz lüğət hazırlayır.

Bir ardıcıllığın bəzi çevrilməsinə əsaslanaraq dəyişməz lüğət qurur.

Bir ardıcıllığı sadalayır və dəyişdirir və məzmununun dəyişməz lüğətini hazırlayır.

Bir ardıcıllığı sadalayır və çevirir və göstərilən əsas müqayisədən istifadə edərək məzmununun dəyişməz lüğətini hazırlayır.

Bir ardıcıllığı sadalayır və çevirir və göstərilən açar və dəyər müqayisələrini istifadə edərək tərkibinin dəyişməz lüğətini hazırlayır.

Bir ardıcıllığı sadalayır və tərkibindəki dəyişməz bir hash dəsti istehsal edir.

Bir ardıcıllığı sadalayır, məzmununun dəyişməz bir qarışıq dəsti istehsal edir və təyin edilmiş bərabərlik müqayisəçisini təyin olunmuş növ üçün istifadə edir.

Bir ardıcıllığı sadalayır və məzmununun dəyişməz bir siyahısını hazırlayır.

Bir ardıcıllığı sadalayır və çevirir və məzmununun dəyişməz çeşidli lüğətini hazırlayır.

Bir ardıcıllığı sadalayır və çevirir və göstərilən əsas müqayisədən istifadə edərək məzmununun dəyişməz çeşidlənmiş lüğətini hazırlayır.

Bir ardıcıllığı sadalayır və çevirir və göstərilən açar və dəyər müqayisələrini istifadə edərək məzmununun dəyişməz bir çeşidli lüğətini hazırlayır.

Bir ardıcıllığı sadalayır və məzmununun dəyişməz bir çeşidlənmiş dəsti istehsal edir.

Bir ardıcıllığı sadalayır, tərkibinin dəyişməz bir çeşidlənmiş dəsti istehsal edir və göstərilən müqayisədən istifadə edir.

Ümumi parametr T-nin DataRow olduğu bir giriş IEnumerable & ltT & gt verilmiş DataRow obyektlərinin nüsxələrini ehtiva edən bir DataTable verir.

Ümumi parametr T-nin DataRow olduğu bir giriş IEnumerable & ltT & gt verilmiş DataRow obyektlərini göstərilən DataTable-a köçürür.

Ümumi parametr T-nin DataRow olduğu bir giriş IEnumerable & ltT & gt verilmiş DataRow obyektlərini göstərilən DataTable-a köçürür.

Bir ardıcıllıqla bir akkumulyator funksiyasını tətbiq edir.

Bir ardıcıllıqla bir akkumulyator funksiyasını tətbiq edir. Müəyyən olunmuş toxum dəyəri ilkin akkumulyator dəyəri kimi istifadə olunur.

Bir ardıcıllıqla bir akkumulyator funksiyasını tətbiq edir. Müəyyən olunmuş toxum dəyəri ilkin akkumulyator dəyəri kimi, göstərilən funksiya isə nəticə dəyərini seçmək üçün istifadə olunur.

Bir ardıcıllığın bütün elementlərinin bir şərti təmin edib etmədiyini təyin edir.

Bir ardıcıllığın hər hansı bir elementin olub-olmadığını müəyyənləşdirir.

Bir ardıcıllığın hər hansı bir elementinin bir şərti təmin edib-etmədiyini təyin edir.

Ardıcıllığın sonuna bir dəyər əlavə edir.

IEnumerable & ltT & gt kimi yazılmış girişi qaytarır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə olunan Ondalık dəyərlər ardıcıllığının ortalamasını hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə olunan Cüt dəyərlər ardıcıllığının ortalamasını hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə edilən Int32 dəyərləri ardıcıllığının ortalamasını hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə edilən Int64 dəyərləri ardıcıllığının ortalamasını hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə edilən sıfır ondalık dəyərlər ardıcıllığının ortalamasını hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə edilən sıfır ikiqat dəyərlər ardıcıllığının ortalamasını hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə edilən sıfır int32 dəyərləri ardıcıllığının ortalamasını hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə edilən sıfır int64 dəyərləri ardıcıllığının ortalamasını hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə edilən sıfır vahid dəyərlər ardıcıllığının ortalamasını hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə olunan Tək dəyərlər ardıcıllığının ortalamasını hesablayır.

IEnumerable elementlərini göstərilən növə atır.

İki ardıcıllığı birləşdirir.

Varsayılan bərabərlik müqayisəsini istifadə edərək bir ardıcıllığın müəyyən bir elementi olub-olmadığını müəyyənləşdirir.

Müəyyən bir IEqualityComparer & ltT & gt istifadə edərək bir ardıcıllığın müəyyən bir elementin olub-olmadığını müəyyənləşdirir.

Bir ardıcıllıqla element sayını qaytarır.

Müəyyən edilmiş ardıcıllıqla bir şərti təmin edən neçə elementi təmsil edən ədədi qaytarır.

Göstərilən ardıcıllığın elementlərini və ya ardıcıllıq boş olduğu halda singleton kolleksiyasındakı tip parametrinin standart dəyərini qaytarır.

Göstərilən ardıcıllığın elementlərini və ya ardıcıllıq boş olduqda singleton kolleksiyasında göstərilən dəyəri qaytarır.

Dəyərləri müqayisə etmək üçün standart bərabərlik müqayisəsini istifadə edərək bir-birindən fərqli elementləri qaytarır.

Dəyərləri müqayisə etmək üçün müəyyən bir IEqualityComparer & ltT & gt istifadə edərək ardıcıllıqla fərqli elementləri qaytarır.

Ardıcıl olaraq göstərilən indeksdəki elementi qaytarır.

Müəyyən edilmiş bir indeksdəki elementi ardıcıllıqla və ya indeks aralığından kənar olduqda standart qiymətə qaytarır.

Dəyərləri müqayisə etmək üçün standart bərabərlik müqayisəsini istifadə edərək iki ardıcıllığın müəyyən fərqini yaradır.

Dəyərləri müqayisə etmək üçün göstərilən IEqualityComparer & ltT & gt istifadə edərək iki ardıcıllığın set fərqini yaradır.

Bir ardıcıllığın ilk elementini qaytarır.

Müəyyən edilmiş şərti təmin edən ardıcıllıqla ilk elementi qaytarır.

Bir ardıcıllığın ilk elementini və ya ardıcıllıqda heç bir element olmadığı təqdirdə standart dəyəri qaytarır.

Bir şərtə cavab verən ardıcıllığın ilk elementini və ya belə bir element tapılmadıqda bir default dəyəri qaytarır.

Müəyyən edilmiş açar seçmə funksiyasına görə ardıcıllığın elementlərini qruplaşdırır.

Bir sıra elementlərini müəyyən bir açar seçici funksiyasına görə qruplaşdırır və müəyyən bir müqayisə aparatından istifadə edərək düymələri müqayisə edir.

Bir sıra elementlərini müəyyən bir açar seçmə funksiyasına görə qruplaşdırır və müəyyən bir funksiyadan istifadə edərək hər qrup üçün elementləri proyeksiyalayır.

Bir ardıcıllığın elementlərini açar seçmə funksiyasına görə qruplaşdırır. Düymələr bir müqayisə cihazı ilə müqayisə edilir və hər bir qrupun elementləri müəyyən bir funksiyadan istifadə edilərək proqnozlaşdırılır.

Bir sıra elementlərini müəyyən bir açar seçmə funksiyasına uyğun olaraq qruplaşdırır və hər qrupdan və onun açarından nəticə dəyəri yaradır.

Bir sıra elementlərini müəyyən bir açar seçmə funksiyasına uyğun olaraq qruplaşdırır və hər qrupdan və onun açarından nəticə dəyəri yaradır. Düymələr müəyyən edilmiş bir müqayisə vasitəsi ilə müqayisə olunur.

Bir sıra elementlərini müəyyən bir açar seçmə funksiyasına uyğun olaraq qruplaşdırır və hər qrupdan və onun açarından nəticə dəyəri yaradır. Hər bir qrupun elementləri müəyyən bir funksiyadan istifadə edərək proqnozlaşdırılır.

Bir sıra elementlərini müəyyən bir açar seçmə funksiyasına uyğun olaraq qruplaşdırır və hər qrupdan və onun açarından nəticə dəyəri yaradır. Əsas dəyərlər müəyyən edilmiş bir müqayisə cihazı ilə müqayisə edilir və hər bir qrupun elementləri müəyyən bir funksiyadan istifadə edilərək proqnozlaşdırılır.

Düymələrin bərabərliyinə əsaslanan iki ardıcıllığın elementlərini əlaqələndirir və nəticələri qruplaşdırır. Varsayılan bərabərlik müqayisəsi düymələri müqayisə etmək üçün istifadə olunur.

Əsas bərabərliyə əsaslanan iki ardıcıllığın elementlərini əlaqələndirir və nəticələri qruplaşdırır. Düymələri müqayisə etmək üçün müəyyən bir IEqualityComparer & ltT & gt istifadə olunur.

Dəyərləri müqayisə etmək üçün standart bərabərlik müqayisəsini istifadə edərək iki ardıcıllığın müəyyən kəsişməsini istehsal edir.

Dəyərləri müqayisə etmək üçün göstərilən IEqualityComparer & ltT & gt istifadə edərək iki ardıcıllığın müəyyən kəsişməsini istehsal edir.

Uyğun düymələrə əsaslanan iki ardıcıllığın elementlərini əlaqələndirir. Varsayılan bərabərlik müqayisəsi düymələri müqayisə etmək üçün istifadə olunur.

Uyğun düymələrə əsaslanan iki ardıcıllığın elementlərini əlaqələndirir. Düymələri müqayisə etmək üçün müəyyən bir IEqualityComparer & ltT & gt istifadə olunur.

Bir ardıcıllığın son elementini qaytarır.

Müəyyən edilmiş şərti təmin edən ardıcıllığın son elementini qaytarır.

Bir ardıcıllığın son elementini və ya ardıcıllıqda heç bir element olmadığı təqdirdə standart dəyəri qaytarır.

Bir şərtə cavab verən bir ardıcıllığın son elementini və ya belə bir element tapılmadıqda bir default dəyəri qaytarır.

Bir ardıcıllıqla elementlərin ümumi sayını təmsil edən bir Int64 qaytarır.

Bir ardıcıllıqla bir şərti təmin edən neçə elementi təmsil edən bir Int64-i qaytarır.

Ümumi ardıcıllıqla maksimum dəyəri qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını işə salır və maksimum Ondalık dəyərini qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını işə salır və maksimum ikiqat dəyərini qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını işə salır və maksimum Int32 dəyərini qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını işə salır və maksimum Int64 dəyərini qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını işə salır və maksimum sıfır Ondalık dəyərini qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını çağırır və maksimum sıfır ikiqat dəyəri qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını işə salır və maksimum sıfır int32 dəyərini qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını işə salır və maksimum sıfır int64 dəyərini qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını işə salır və maksimum sıfır vahid dəyəri qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını işə salır və maksimum Tək dəyəri qaytarır.

Ümumi ardıcıllığın hər bir elementinə çevrilmə funksiyasını işə salır və nəticədə əldə olunan maksimum dəyəri qaytarır.

Ümumi ardıcıllıqla minimum dəyəri qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını işə salır və minimum Ondalık dəyərini qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını çağırır və minimum ikiqat dəyəri qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını çağırır və minimum Int32 dəyərini qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını işə salır və minimum Int64 dəyərini qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını çağırır və minimum sıfır Ondalık dəyərini qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını çağırır və minimum sıfır ikiqat dəyəri qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını çağırır və minimum sıfır int32 dəyərini qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını işə salır və minimum sıfır int64 dəyərini qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını işə salır və minimum sıfır vahid dəyəri qaytarır.

Bir ardıcıllığın hər bir elementinə çevrilmə funksiyasını işə salır və minimum Tək dəyəri qaytarır.

Ümumi ardıcıllığın hər bir elementinə çevrilmə funksiyasını işə salır və nəticədə minimum dəyəri qaytarır.

Müəyyən edilmiş bir növə əsasən IEnumerable elementlərini süzgəcdən keçirir.

Bir ardıcıllığın elementlərini bir açara görə artan sırada sıralayır.

Müəyyən edilmiş bir müqayisə aparatını istifadə edərək ardıcıllığın elementlərini artan sırada sıralayır.

Bir ardıcıllığın elementlərini bir açara görə azalan sırada sıralayır.

Bir ardıcıllığın elementlərini müəyyən bir müqayisə aparatını azalan qaydada sıralayır.

Ardıcıllığın əvvəlinə bir dəyər əlavə edir.

Elementlərin ardıcıllığını tərsinə çevirir.

Bir ardıcıllığın hər bir elementini yeni bir forma proyeksiyalayır.

Bir ardıcıllığın hər bir elementini element indeksinə daxil edərək yeni bir formaya proqnozlaşdırır.

Bir ardıcıllığın hər bir elementini bir IEnumerable & ltT & gt-ə proyeksiyalayır və yaranan ardıcıllıqları bir ardıcıllığa düzəldir.

Bir ardıcıllığın hər bir elementini bir IEnumerable & ltT & gt-ə proyeksiyalayır və yaranan ardıcıllıqları bir ardıcıllığa düzəldir. Hər bir mənbə elementinin indeksi həmin elementin proqnozlaşdırılan formasında istifadə olunur.

Bir ardıcıllığın hər bir elementini bir IEnumerable & ltT & gt-ə proyeksiya edir, yaranan ardıcıllıqları bir ardıcıllığa düzəldir və içindəki hər bir elementdə nəticə seçici funksiyasını işə salır.

Bir ardıcıllığın hər bir elementini bir IEnumerable & ltT & gt-ə proyeksiya edir, yaranan ardıcıllıqları bir ardıcıllığa düzəldir və içindəki hər bir elementdə nəticə seçici funksiyasını işə salır. Hər bir mənbə elementinin indeksi həmin elementin ara proqnozlaşdırılan formasında istifadə olunur.

İki ardıcıllığın bərabər olub olmadığını, elementləri növlərinə görə standart bərabərlik müqayisəsindən istifadə edərək müqayisə edərək müəyyənləşdirir.

Müəyyən edilmiş IEqualityComparer & ltT & gt istifadə edərək elementlərini müqayisə edərək iki ardıcıllığın bərabər olub olmadığını təyin edir.

Bir ardıcıllığın yeganə elementini qaytarır və ardıcıllıqla tam bir element olmadığı təqdirdə bir istisna atar.

Müəyyən edilmiş şərti təmin edən ardıcıllığın yeganə elementini qaytarır və birdən çox bu cür element varsa istisna edir.

Bir ardıcıllığın yeganə elementini və ya ardıcıllıq boş olduğu təqdirdə bir defolt dəyərini qaytarır, bu ardıcıllıqla birdən çox element varsa, istisna edir.

Müəyyən bir şərti təmin edən bir ardıcıllığın yeganə elementini və ya belə bir element olmadığı təqdirdə bir standart dəyəri qaytarır, bu metod birdən çox element şərti təmin edərsə bir istisna atar.

Müəyyən edilmiş element sayını ardıcıllıqla atlayır və sonra qalan elementləri qaytarır.

Mənbə kolleksiyasının son sayma elementləri buraxılmış mənbədən elementləri ehtiva edən yeni bir sayılan kolleksiyanı qaytarır.

Müəyyən edilmiş şərt doğru olduğu müddətdə elementləri ardıcıllıqla atlayır və sonra qalan elementləri qaytarır.

Müəyyən edilmiş şərt doğru olduğu müddətdə elementləri ardıcıllıqla atlayır və sonra qalan elementləri qaytarır. Element indeksindən predikat funksiyasının məntiqində istifadə olunur.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə olunan Ondalık dəyərlər ardıcıllığının cəmini hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə olunan Cüt dəyərlər ardıcıllığının cəmini hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə edilən Int32 dəyərlərinin ardıcıllığının cəmini hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə edilən Int64 dəyərlərinin ardıcıllığının cəmini hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə edilən sıfır ondalık dəyərlərinin ardıcıllığının cəmini hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə edilən sıfır ikiqat dəyərlər ardıcıllığının cəmini hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə edilən sıfır int32 dəyərlərinin ardıcıllığının cəmini hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə edilən sıfır int64 dəyərlərinin ardıcıllığının cəmini hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə edilən sıfır vahid dəyərlər ardıcıllığının cəmini hesablayır.

Giriş ardıcıllığının hər bir elementinə çevrilmə funksiyasını işə salmaqla əldə olunan Tək dəyərlər ardıcıllığının cəmini hesablayır.

Bir ardıcıllığın başlanğıcından müəyyən sayda bitişik elementi qaytarır.

Mənbədən son sayma elementlərini ehtiva edən yeni bir sayılan kolleksiyanı qaytarır.

Müəyyən edilmiş şərt doğru olduğu müddətdə elementləri ardıcıllıqla qaytarır.

Müəyyən edilmiş şərt doğru olduğu müddətdə elementləri ardıcıllıqla qaytarır. Element indeksindən predikat funksiyasının məntiqində istifadə olunur.

Müəyyən edilmiş bir açar seçmə funksiyasına uyğun olaraq bir IEnumerable & ltT & gt-dən Lüğət & ltTKey, TValue & gt yaradır.

Müəyyən edilmiş bir açar seçmə funksiyasına və açar müqayisəsinə görə bir IEnumerable & ltT & gt-dən bir lüğət & ltTKey, TValue & gt yaradır.

Müəyyən açar seçici və element seçmə funksiyalarına uyğun olaraq bir IEnumerable & ltT & gt-dən bir lüğət & ltTKey, TValue & gt yaradır.

Müəyyən edilmiş bir açar seçmə funksiyasına, müqayisəediciyə və element seçmə funksiyasına uyğun olaraq bir IEnumerable & ltT & gt-dən Lüğət & ltTKey, TValue & gt yaradır.

Düymələri müqayisə etmək üçün müqayisədən istifadə edərək IEnumerable & ltT & gt-dən HashSet & ltT & gt yaradır.

Müəyyən bir açar seçmə funksiyasına uyğun olaraq bir IEnumerable & ltT & gt-dən Axtarış & ltTKey, TElement & gt yaradır.

Müəyyən edilmiş bir açar seçmə funksiyasına və açar müqayisəsinə görə bir IEnumerable & ltT & gt-dən Axtarış & ltTKey, TElement & gt yaradır.

Göstərilən açar seçici və element seçmə funksiyalarına uyğun olaraq bir IEnumerable & ltT & gt-dən Axtarış & ltTKey, TElement & gt yaradır.

Müəyyən edilmiş bir açar seçmə funksiyasına, bir müqayisəyə və element seçmə funksiyasına uyğun olaraq bir IEnumerable & ltT & gt-dən bir Axtarış & ltTKey, TElement & gt yaradır.

Varsayılan bərabərlik müqayisəsini istifadə edərək iki ardıcıllığın müəyyən birliyini istehsal edir.

Müəyyən edilmiş IEqualityComparer & ltT & gt istifadə edərək iki ardıcıllığın qurulmuş birliyini istehsal edir.

Bir predikat əsasında dəyərlər ardıcıllığını süzgəcdən keçirir.

Bir predikat əsasında dəyərlər ardıcıllığını süzgəcdən keçirir. Hər bir elementin göstəricisi predikat funksiyasının məntiqində istifadə olunur.

Göstərilən iki ardıcıllığın elementləri olan bir sıra ardıcıllıq yaradır.

Nəticələrin ardıcıllığını yaradan iki ardıcıllığın uyğun elementlərinə müəyyən bir funksiyanı tətbiq edir.

Sorğunun paralelləşdirilməsini təmin edir.

Sorğunun paralelləşdirilməsini təmin edir.

Mənbə kolleksiyasındakı hər bir qovşağın əcdadlarını ehtiva edən elementlər toplusunu qaytarır.

Mənbə kolleksiyasındakı hər bir qovşağın əcdadlarını ehtiva edən süzülmüş elementlər toplusunu qaytarır. Kolleksiyaya yalnız uyğun XName elementləri daxil edilmişdir.

Mənbə kolleksiyasındakı hər sənədin və elementin nəsil qovşaqlarının toplusunu qaytarır.

Mənbə kolleksiyasındakı hər elementin və sənədin nəsil elementlərini ehtiva edən elementlər toplusunu qaytarır.

Mənbə kolleksiyasındakı hər elementin və sənədin nəsil elementlərini ehtiva edən süzülmüş elementlər toplusunu qaytarır. Kolleksiyaya yalnız uyğun XName elementləri daxil edilmişdir.

Mənbə kolleksiyasındakı hər elementin və sənədin alt elementlərinin toplusunu qaytarır.

Mənbə kolleksiyasındakı hər elementin və sənədin alt elementlərinin süzülmüş toplusunu qaytarır. Kolleksiyaya yalnız uyğun XName elementləri daxil edilmişdir.

Mənbə kolleksiyasındakı bütün qovşaqları özündə birləşdirən sənədlər sırasına uyğun qovşaqlar toplusunu qaytarır.

Mənbə kolleksiyasındakı hər sənədin və elementin uşaq qovşaqlarının toplusunu qaytarır.


Nümunə ilə İnformatikada toplayıcı çevrilmə

Aqreqator transformasiyası cəm, orta və s. Kimi məcmu hesablamalar aparmaq üçün aktiv bir çevrilmədir.

Məsələn, bütün işçilər bölməsinin maaşlarının cəmini hesablamaq istəyirsinizsə, Toplayıcı Çevrilmədən istifadə edə bilərik.

Toplu əməliyyatlar bir sıra sətir üzərində aparılır, buna görə bütün bu qeydləri saxlamaq və hesablamaları yerinə yetirmək üçün müvəqqəti bir yer tutucu tələb olunur.

Bunun üçün toplayıcı önbellek istifadə olunur. Bu, bu cür əməliyyatları yerinə yetirmək üçün aqreqator çevrilməsinə ayrılan müvəqqəti əsas yaddaşdır.

Bu nümunədə maaş şöbəsinin cəmini ağıllı hesablayacağıq. Bunun üçün bu məbləği saxlamaq üçün yeni bir sütun tələb edirik. Beləliklə, ilk növbədə yeni bir köşə hazırlayacağıq.

Addım 1 - Yeni bir verilənlər bazası hədəf cədvəli yaradın, məsələn, aşağıdakı skriptdən istifadə edərək "sum_sal_deptwise" deyin. Növbəti addımda yeni verilənlər bazası hədəf cədvəlinin Hədəf qovluğu altında yaradıldığını görəcəksiniz.

Addım 2 - Yeni bir "m_ sum_sal_deptwise" Xəritəçəkmə yaradın.

Yeni Xəritəçəkmə yaratmaq üçün həm xəritə dizaynında həm də mənbə cədvəlinə (EMP) və hədəf cədvəlinə (sum_sal_deptwise) ehtiyacımız var.

Addım 3 - Xəritəçəkmə,

Addım 4 - SAL & amp DEPTNO sütunlarını mənbə seçicisindən (SQ_EMP) aqreqator çevrilməsinə sürükləyin və buraxın.

Addım 5 - Xüsusiyyətlərini açmaq üçün aqreqator çevrilməsinə iki dəfə vurun və sonra

Addım 6 - İfadə pəncərəsində

Addım 7 - Düzəliş pəncərəsində onay qutusunu deptno sütununa işarələyərək "GroupBy" seçimini seçin və Tamam düyməsini basın (deptno-ya qarşı qrup seçərək, Informatica-ya maaşları deptno ilə qruplaşdırmağı öyrədirik)

Addım 8 - Deptno və sum_sal sütunlarını aqreqator çevrilməsindən hədəf cədvəlinə bağlayın

İndi Xəritəçəkmə qeyd edin və bu Xəritəçəkmə üçün yeni bir sessiya yaratdıqdan sonra həyata keçirin. Hədəf cədvəlində əmək haqqı şöbəsinin cəmini ehtiva edir. Bu şəkildə məcmu nəticələri hesablamaq üçün aqreqator çevrilməsindən istifadə edə bilərik.


Təqdimedici düymələr

According to the Webster’s Unabridged Dictionary, a surrogate is an “artificial or synthetic product that is used as a substitute for a natural product.” Thatýs a great definition for the surrogate keys we use in data warehouses. A surrogate key is an artificial or synthetic key that is used as a substitute for a natural key.

Actually, a surrogate key in a data warehouse is more than just a substitute for a natural key. In a data warehouse, a surrogate key is a necessary generalization of the natural production key and is one of the basic elements of data warehouse design. Let’s be very clear: Every join between dimension tables and fact tables in a data warehouse environment should be based on surrogate keys, not natural keys. It is up to the data extract logic to systematically look up and replace every incoming natural key with a data warehouse surrogate key each time either a dimension record or a fact record is brought into the data warehouse environment.

In other words, when we have a product dimension joined to a fact table, or a customer dimension joined to a fact table, or even a time dimension joined to a fact table, the actual physical keys on either end of the joins are not natural keys directly derived from the incoming data. Rather, the keys are surrogate keys that are just anonymous integers. Each one of these keys should be a simple integer, starting with one and going up to the highest number that is needed. The product key should be a simple integer, the customer key should be a simple integer, and even the time key should be a simple integer. None of the keys should be:

  • Smart, where you can tell something about the record just by looking at the key
  • Composed of natural keys glued together
  • Implemented as multiple parallel joins between the dimension table and the fact table so-called double or triple barreled joins.

If you are a professional DBA, I probably have your attention. If you are new to data warehousing, you are probably horrified. Perhaps you are saying, “But if I know what my underlying key is, all my training suggests that I make my key out of the data I am given.” Yes, in the production transaction processing environment, the meaning of a product key or a customer key is directly related to the record’s content. In the data warehouse environment, however, a dimension key must be a generalization of what is found in the record.

As the data warehouse manager, you need to keep your keys independent from the production keys. Production has different priorities from you. Production keys such as product keys or customer keys are generated, formatted, updated, deleted, recycled, and reused according to the dictates of production. If you use production keys as your keys, you will be jerked around by changes that can be, at the very least, annoying, and at the worst, disastrous. Suppose that you need to keep a three-year history of product sales in your large sales fact table, but production decides to purge their product file every 18 months. What do you do then? Let’s list some of the ways that production may step on your toes:

  • Production may reuse keys that it has purged but that you are still maintaining, as I described.
  • Production may make a mistake and reuse a key even when it isn’t supposed to. This happens frequently in the world of UPCs in the retail world, despite everyone’s best intentions.
  • Production may re-compact its key space because it has a need to garbage-collect the production system. One of my customers was recently handed a data warehouse load tape with all the production customer keys reassigned!
  • Production may legitimately overwrite some part of a product description or a customer description with new values but not change the product key or the customer key to a new value. You are left holding the bag and wondering what to do about the revised attribute values. This is the Slowly Changing Dimension crisis, which I will explain in a moment.
  • Production may generalize its key format to handle some new situation in the transaction system. Now the production keys that used to be integers become alphanumeric. Or perhaps the 12-byte keys you are used to have become 20-byte keys.
  • Your company has just made an acquisition, and you need to merge more than a million new customers into the master customer list. You will now need to extract from two production systems, but the newly acquired production system has nasty customer keys that don’t look remotely like the others.

The Slowly Changing Dimension crisis I mentioned earlier is a well-known situation in data warehousing. Rather than blaming production for not handling its keys better, it is more constructive to recognize that this is an area where the interests of production and the interests of the data warehouse legitimately diverge. Usually, when the data warehouse administrator encounters a changed description in a dimension record such as product or customer, the correct response is to issue a new dimension record. But to do this, the data warehouse must have a more general key structure. Hence the need for a surrogate key.

There are still more reasons to use surrogate keys. One of the most important is the need to encode uncertain knowledge. You may need to supply a customer key to represent a transaction, but perhaps you donýt know for certain who the customer is. This would be a common occurrence in a retail situation where cash transactions are anonymous, like most grocery stores. What is the customer key for the anonymous customer? Perhaps you have introduced a special key that stands for this anonymous customer. This is politely referred to as a “hack.”

If you think carefully about the “I don’t know” situation, you may want more than just this one special key for the anonymous customer. You may also want to describe the situation where “the customer identification has not taken place yet.” Or maybe, “there was a customer, but the data processing system failed to report it correctly.” And also, “no customer is possible in this situation.” All of these situations call for a data warehouse customer key that cannot be composed from the transaction production customer keys. Don’t forget that in the data warehouse you must provide a customer key for every fact record in the schema shown in Figure 1. A null key automatically turns on the referential integrity alarm in your data warehouse because a foreign key (as in the fact table) can never be null.

The “I don’t know” situation occurs quite frequently for dates. You are probably using date-valued keys for your joins between your fact tables and your dimension tables. Once again, if you have done this you are forced to use some kind of real date to represent the special situations where a date value is not possible. I hope you have not been using January 1, 2000 to stand for “I don’t know.” If you have done this, you have managed to combine the production key crisis with the Year 2000 crisis.

Maybe one of the reasons you are holding on to your smart keys built up out of real data is that you think you want to navigate the keys directly with an application, avoiding the join to the dimension table. It is time to forget this strategy. If the fifth through ninth alpha characters in the join key can be interpreted as a manufacturer’s ID, then copy these characters and make them a normal field in the dimension table. Better yet, add the manufacturer’s name in plain text as a field. As the final step, consider throwing away the alphanumeric manufacturer ID. The only reason the marketing end users know these IDs is that they have been forced to use them for computer requests.

Holding onto real date values as keys is also a strategic blunder. Yes, you can navigate date keys with straight SQL, thereby avoiding the join, but you have left all your special calendar information marooned in the date dimension table. If you navigate naked date keys with an application, you will inevitably begin embedding calendar logic in your application. Calendar logic belongs in a dimension table, not in your application code.

You may be able to save substantial storage space with integer-valued surrogate keys. Suppose you have a big fact table with a billion rows of data. In such a table, every byte wasted in each row is a gigabyte of total storage. The beauty of a four-byte integer key is that it can represent more than 2 billion different values. That is enough for any dimension, even the so-called monster dimensions that represent individual human beings. So we compress all our long customer IDs and all our long product stock keeping units and all our date stamps down to four-byte keys. This saves many gigabytes of total storage.

The final reason I can think of for surrogate keys is one that I strongly suspect but have never proven. Replacing big, ugly natural keys and composite keys with beautiful, tight integer surrogate keys is bound to improve join performance. The storage requirements are reduced, and the index lookups would seem to be simpler. I would be interested in hearing from anyone who has harvested a performance boost by replacing big ugly fat keys with anonymous integer keys.

Having made the case for surrogate keys, we now are faced with creating them. Fundamentally, every time we see a natural key in the incoming data stream, we must look up the correct value of the surrogate key and replace the natural key with the surrogate key. Because this is a significant step in the daily extract and transform process within the data staging area, we need to tighten down our techniques to make this lookup simple and fast.


Transform

transform, metamorphose, transmute, convert, transmogrify, transfigure mean to change a thing into a different thing. transform implies a major change in form, nature, or function. transformed a small company into a corporate giant metamorphose suggests an abrupt or startling change induced by or as if by magic or a supernatural power. awkward girls metamorphosed into graceful ballerinas transmute implies transforming into a higher element or thing. attempted to transmute lead into gold convert implies a change fitting something for a new or different use or function. converted the study into a nursery transmogrify suggests a strange or preposterous metamorphosis. a story in which a frog is transmogrified into a prince transfigure implies a change that exalts or glorifies. joy transfigured her face


About the Author

Siddharth Teotia is a software engineer at Dremio and a contributor to Apache Arrow project. Previously, Siddharth was on the database kernel team at Oracle, where he worked on storage, indexing, and the in-memory columnar query processing layers of Oracle RDBMS. He holds an MS in software engineering from CMU and a BS in information systems from BITS Pilani, India. During his studies, Siddharth focused on distributed systems, databases, and software architecture.


Mündəricat

The first part of an ETL process involves extracting the data from the source system(s). In many cases, this represents the most important aspect of ETL, since extracting data correctly sets the stage for the success of subsequent processes. Most data-warehousing projects combine data from different source systems. Each separate system may also use a different data organization and/or format. Common data-source formats include relational databases, XML, JSON and flat files, but may also include non-relational database structures such as Information Management System (IMS) or other data structures such as Virtual Storage Access Method (VSAM) or Indexed Sequential Access Method (ISAM), or even formats fetched from outside sources by means such as web spidering or screen-scraping. The streaming of the extracted data source and loading on-the-fly to the destination database is another way of performing ETL when no intermediate data storage is required.

An intrinsic part of the extraction involves data validation to confirm whether the data pulled from the sources has the correct/expected values in a given domain (such as a pattern/default or list of values). If the data fails the validation rules, it is rejected entirely or in part. The rejected data is ideally reported back to the source system for further analysis to identify and to rectify the incorrect records.

In the data transformation stage, a series of rules or functions are applied to the extracted data in order to prepare it for loading into the end target.

An important function of transformation is data cleansing, which aims to pass only "proper" data to the target. The challenge when different systems interact is in the relevant systems' interfacing and communicating. Character sets that may be available in one system may not be so in others.

In other cases, one or more of the following transformation types may be required to meet the business and technical needs of the server or data warehouse:

  • Selecting only certain columns to load: (or selecting null columns not to load). For example, if the source data has three columns (aka "attributes"), roll_no, age, and salary, then the selection may take only roll_no and salary. Or, the selection mechanism may ignore all those records where salary is not present (salary = null).
  • Translating coded values: (məs., if the source system codes male as "1" and female as "2", but the warehouse codes male as "M" and female as "F")
  • Encoding free-form values: (məs., mapping "Male" to "M")
  • Deriving a new calculated value: (məs., sale_amount = qty * unit_price)
  • Sorting or ordering the data based on a list of columns to improve search performance data from multiple sources (məs., lookup, merge) and deduplicating the data
  • Aggregating (for example, rollup — summarizing multiple rows of data — total sales for each store, and for each region, etc.)
  • Generating surrogate-key values or pivoting (turning multiple columns into multiple rows or vice versa)
  • Splitting a column into multiple columns (məs., converting a comma-separated list, specified as a string in one column, into individual values in different columns)
  • Disaggregating repeating columns
  • Looking up and validating the relevant data from tables or referential files
  • Applying any form of data validation failed validation may result in a full rejection of the data, partial rejection, or no rejection at all, and thus none, some, or all of the data is handed over to the next step depending on the rule design and exception handling many of the above transformations may result in exceptions, e.g., when a code translation parses an unknown code in the extracted data

The load phase loads the data into the end target, which can be any data store including a simple delimited flat file or a data warehouse. [5] Depending on the requirements of the organization, this process varies widely. Some data warehouses may overwrite existing information with cumulative information updating extracted data is frequently done on a daily, weekly, or monthly basis. Other data warehouses (or even other parts of the same data warehouse) may add new data in a historical form at regular intervals — for example, hourly. To understand this, consider a data warehouse that is required to maintain sales records of the last year. This data warehouse overwrites any data older than a year with newer data. However, the entry of data for any one year window is made in a historical manner. The timing and scope to replace or append are strategic design choices dependent on the time available and the business needs. More complex systems can maintain a history and audit trail of all changes to the data loaded in the data warehouse. [6]

As the load phase interacts with a database, the constraints defined in the database schema — as well as in triggers activated upon data load — apply (for example, uniqueness, referential integrity, mandatory fields), which also contribute to the overall data quality performance of the ETL process.

  • For example, a financial institution might have information on a customer in several departments and each department might have that customer's information listed in a different way. The membership department might list the customer by name, whereas the accounting department might list the customer by number. ETL can bundle all of these data elements and consolidate them into a uniform presentation, such as for storing in a database or data warehouse.
  • Another way that companies use ETL is to move information to another application permanently. For instance, the new application might use another database vendor and most likely a very different database schema. ETL can be used to transform the data into a format suitable for the new application to use.
  • An example would be an Expense and Cost Recovery System (ECRS) such as used by accountancies, consultancies, and legal firms. The data usually ends up in the time and billing system, although some businesses may also utilize the raw data for employee productivity reports to Human Resources (personnel dept.) or equipment usage reports to Facilities Management.

The typical real-life ETL cycle consists of the following execution steps:

  1. Cycle initiation
  2. Build reference data
  3. Extract (from sources)
  4. Transform (clean, apply business rules, check for data integrity, create aggregates or disaggregates)
  5. Stage (load into staging tables, if used) (for example, on compliance with business rules. Also, in case of failure, helps to diagnose/repair)
  6. Publish (to target tables)

ETL processes can involve considerable complexity, and significant operational problems can occur with improperly designed ETL systems.

The range of data values or data quality in an operational system may exceed the expectations of designers at the time validation and transformation rules are specified. Data profiling of a source during data analysis can identify the data conditions that must be managed by transform rules specifications, leading to an amendment of validation rules explicitly and implicitly implemented in the ETL process.

Data warehouses are typically assembled from a variety of data sources with different formats and purposes. As such, ETL is a key process to bring all the data together in a standard, homogeneous environment.

Design analysis [7] should establish the scalability of an ETL system across the lifetime of its usage — including understanding the volumes of data that must be processed within service level agreements. The time available to extract from source systems may change, which may mean the same amount of data may have to be processed in less time. Some ETL systems have to scale to process terabytes of data to update data warehouses with tens of terabytes of data. Increasing volumes of data may require designs that can scale from daily batch to multiple-day micro batch to integration with message queues or real-time change-data-capture for continuous transformation and update.

ETL vendors benchmark their record-systems at multiple TB (terabytes) per hour (or

1 GB per second) using powerful servers with multiple CPUs, multiple hard drives, multiple gigabit-network connections, and much memory.

In real life, the slowest part of an ETL process usually occurs in the database load phase. Databases may perform slowly because they have to take care of concurrency, integrity maintenance, and indices. Thus, for better performance, it may make sense to employ:

  • Direct path extract method or bulk unload whenever is possible (instead of querying the database) to reduce the load on source system while getting high-speed extract
  • Most of the transformation processing outside of the database
  • Bulk load operations whenever possible

Still, even using bulk operations, database access is usually the bottleneck in the ETL process. Some common methods used to increase performance are:

    tables (and indices): try to keep partitions similar in size (watch for null values that can skew the partitioning)
  • Do all validation in the ETL layer before the load: disable integrity checking ( disable constraint . ) in the target database tables during the load
  • Disable triggers ( disable trigger . ) in the target database tables during the load: simulate their effect as a separate step
  • Generate IDs in the ETL layer (not in the database)
  • Drop the indices (on a table or partition) before the load - and recreate them after the load (SQL: drop index . create index . )
  • Use parallel bulk load when possible — works well when the table is partitioned or there are no indices (Note: attempting to do parallel loads into the same table (partition) usually causes locks — if not on the data rows, then on indices)
  • If a requirement exists to do insertions, updates, or deletions, find out which rows should be processed in which way in the ETL layer, and then process these three operations in the database separately you often can do bulk load for inserts, but updates and deletes commonly go through an API (using SQL)

Whether to do certain operations in the database or outside may involve a trade-off. For example, removing duplicates using distinct may be slow in the database thus, it makes sense to do it outside. On the other side, if using distinct significantly (x100) decreases the number of rows to be extracted, then it makes sense to remove duplications as early as possible in the database before unloading data.

A common source of problems in ETL is a big number of dependencies among ETL jobs. For example, job "B" cannot start while job "A" is not finished. One can usually achieve better performance by visualizing all processes on a graph, and trying to reduce the graph making maximum use of parallelism, and making "chains" of consecutive processing as short as possible. Again, partitioning of big tables and their indices can really help.

Another common issue occurs when the data are spread among several databases, and processing is done in those databases sequentially. Sometimes database replication may be involved as a method of copying data between databases — it can significantly slow down the whole process. The common solution is to reduce the processing graph to only three layers:

This approach allows processing to take maximum advantage of parallelism. For example, if you need to load data into two databases, you can run the loads in parallel (instead of loading into the first — and then replicating into the second).

Sometimes processing must take place sequentially. For example, dimensional (reference) data are needed before one can get and validate the rows for main "fact" tables.

A recent [update] development in ETL software is the implementation of parallel processing. It has enabled a number of methods to improve overall performance of ETL when dealing with large volumes of data.

ETL applications implement three main types of parallelism:

  • Data: By splitting a single sequential file into smaller data files to provide parallel access : allowing the simultaneous running of several components on the same data stream, e.g. looking up a value on record 1 at the same time as adding two fields on record 2
  • Component: The simultaneous running of multiple processes on different data streams in the same job, e.g. sorting one input file while removing duplicates on another file

All three types of parallelism usually operate combined in a single job or task.

An additional difficulty comes with making sure that the data being uploaded is relatively consistent. Because multiple source databases may have different update cycles (some may be updated every few minutes, while others may take days or weeks), an ETL system may be required to hold back certain data until all sources are synchronized. Likewise, where a warehouse may have to be reconciled to the contents in a source system or with the general ledger, establishing synchronization and reconciliation points becomes necessary.

Data warehousing procedures usually subdivide a big ETL process into smaller pieces running sequentially or in parallel. To keep track of data flows, it makes sense to tag each data row with "row_id", and tag each piece of the process with "run_id". In case of a failure, having these IDs help to roll back and rerun the failed piece.

Best practice also calls for checkpoints, which are states when certain phases of the process are completed. Once at a checkpoint, it is a good idea to write everything to disk, clean out some temporary files, log the state, etc.

As of 2010 [update] , data virtualization had begun to advance ETL processing. The application of data virtualization to ETL allowed solving the most common ETL tasks of data migration and application integration for multiple dispersed data sources. Virtual ETL operates with the abstracted representation of the objects or entities gathered from the variety of relational, semi-structured, and unstructured data sources. ETL tools can leverage object-oriented modeling and work with entities' representations persistently stored in a centrally located hub-and-spoke architecture. Such a collection that contains representations of the entities or objects gathered from the data sources for ETL processing is called a metadata repository and it can reside in memory [8] or be made persistent. By using a persistent metadata repository, ETL tools can transition from one-time projects to persistent middleware, performing data harmonization and data profiling consistently and in near-real time. [9]

Unique keys play an important part in all relational databases, as they tie everything together. A unique key is a column that identifies a given entity, whereas a foreign key is a column in another table that refers to a primary key. Keys can comprise several columns, in which case they are composite keys. In many cases, the primary key is an auto-generated integer that has no meaning for the business entity being represented, but solely exists for the purpose of the relational database - commonly referred to as a surrogate key.

As there is usually more than one data source getting loaded into the warehouse, the keys are an important concern to be addressed. For example: customers might be represented in several data sources, with their Social Security Number as the primary key in one source, their phone number in another, and a surrogate in the third. Yet a data warehouse may require the consolidation of all the customer information into one dimension.

A recommended way to deal with the concern involves adding a warehouse surrogate key, which is used as a foreign key from the fact table. [10]

Usually, updates occur to a dimension's source data, which obviously must be reflected in the data warehouse.

If the primary key of the source data is required for reporting, the dimension already contains that piece of information for each row. If the source data uses a surrogate key, the warehouse must keep track of it even though it is never used in queries or reports it is done by creating a lookup table that contains the warehouse surrogate key and the originating key. [11] This way, the dimension is not polluted with surrogates from various source systems, while the ability to update is preserved.

The lookup table is used in different ways depending on the nature of the source data. There are 5 types to consider [11] three are included here:

Type 1 The dimension row is simply updated to match the current state of the source system the warehouse does not capture history the lookup table is used to identify the dimension row to update or overwrite Type 2 A new dimension row is added with the new state of the source system a new surrogate key is assigned source key is no longer unique in the lookup table Fully logged A new dimension row is added with the new state of the source system, while the previous dimension row is updated to reflect it is no longer active and time of deactivation.

By using an established ETL framework, one may increase one's chances of ending up with better connectivity and scalability. [ alıntıya ehtiyac var ] A good ETL tool must be able to communicate with the many different relational databases and read the various file formats used throughout an organization. ETL tools have started to migrate into Enterprise Application Integration, or even Enterprise Service Bus, systems that now cover much more than just the extraction, transformation, and loading of data. Many ETL vendors now have data profiling, data quality, and metadata capabilities. A common use case for ETL tools include converting CSV files to formats readable by relational databases. A typical translation of millions of records is facilitated by ETL tools that enable users to input csv-like data feeds/files and import it into a database with as little code as possible.

ETL tools are typically used by a broad range of professionals — from students in computer science looking to quickly import large data sets to database architects in charge of company account management, ETL tools have become a convenient tool that can be relied on to get maximum performance. ETL tools in most cases contain a GUI that helps users conveniently transform data, using a visual data mapper, as opposed to writing large programs to parse files and modify data types.

While ETL tools have traditionally been for developers and IT staff, the new trend is to provide these capabilities to business users so they can themselves create connections and data integrations when needed, rather than going to the IT staff. [12] Gartner refers to these non-technical users as Citizen Integrators. [13]

Extract, load, transform (ELT) is a variant of ETL where the extracted data is loaded into the target system first. [14] The architecture for the analytics pipeline shall also consider where to cleanse and enrich data [14] as well as how to conform dimensions. [4]

Cloud-based data warehouses like Amazon Redshift, Google BigQuery, and Snowflake Computing have been able to provide highly scalable computing power. This lets businesses forgo preload transformations and replicate raw data into their data warehouses, where it can transform them as needed using SQL.

After having used ELT, data may be processed further and stored in a data mart. [15]


Videoya baxın: Qarabağ haqqında 5 cümlə - Qarabağ sözünün etimologiyası (Sentyabr 2021).