αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš ETL αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΌαž…αž˜αž½αž™

αž˜αž“αž»αžŸαŸ’αžŸαž‡αžΆαž…αŸ’αžšαžΎαž“αž”αŸ’αžšαžΎαž§αž”αž€αžšαžŽαŸαž―αž€αž‘αŸαžŸαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž“αžΈαžαž·αžœαž·αž’αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαŸ’αžšαž„αŸ‹αž…αŸαž‰ αž”αŸ†αž”αŸ’αž›αŸ‚αž„ αž“αž·αž„αž•αŸ’αž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αŸ” αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž§αž”αž€αžšαžŽαŸαž’αŸ’αžœαžΎαž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžαŸ‹αžαŸ’αžšαžΆαž€αŸ†αž αž»αžŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αž½αžŸαž‡αž»αž›αŸ”

αž€αŸ’αž“αž»αž„β€‹αž€αžšαžŽαžΈβ€‹αž˜αžΆαž“β€‹αž€αŸ†αž αž»αžŸ αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»β€‹αž˜αžΆαž“β€‹αž–αŸαžαŸŒαž˜αžΆαž“β€‹αžŠαŸ‚αž›β€‹αž§αž”αž€αžšαžŽαŸβ€‹αž”αžΆαž“β€‹αž”αžšαžΆαž‡αŸαž™β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž”αŸ†αž–αŸαž‰β€‹αž€αž·αž…αŸ’αž…αž€αžΆαžš αž αžΎαž™β€‹αž˜αŸ‰αžΌαžŒαž»αž›β€‹αžŽαžΆβ€‹αžαŸ’αž›αŸ‡ (αž‡αžΆβ€‹αž‰αžΉαž€αž‰αžΆαž”αŸ‹ java) αž”αžΆαž“β€‹αžˆαž”αŸ‹β€‹αž“αŸ…β€‹αž€αž“αŸ’αž›αŸ‚αž„β€‹αžŽαžΆαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž“αŸ’αž‘αžΆαžαŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž’αŸ’αž“αž€αž’αžΆαž…αžšαž€αžƒαžΎαž‰αž€αŸ†αž αž»αžŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž§αž‘αžΆαž αžšαžŽαŸ αž€αžΆαžšαžšαŸ†αž›αŸ„αž—αž›αžΎαž‚αž“αŸ’αž›αžΉαŸ‡αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αžšαž”αžŸαŸ‹αžαžΆαžšαžΆαž„αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž†αŸ’αž›αžΎαž™αžŸαŸ†αžŽαž½αžšαžαžΆαžαžΎαž–αŸαžαŸŒαž˜αžΆαž“αž€αŸ†αž αž»αžŸ ETL αž˜αžΆαž“αžαž½αž“αžΆαž‘αžΈαž’αŸ’αžœαžΈ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž…αžΆαžαŸ‹αžαŸ’αž“αžΆαž€αŸ‹αž”αž‰αŸ’αž αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž€αžΎαžαž‘αžΎαž„αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž–αžΈαžšαž†αŸ’αž“αžΆαŸ†αž€αž“αŸ’αž›αž„αž˜αž€αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αž’αŸ†αž‡αžΆαž„αŸ”

αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš ETL αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΌαž…αž˜αž½αž™

αž€αŸ†αž αž»αžŸβ€‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“β€‹αž‘αž·αž“αŸ’αž“αž“αŸαž™β€‹αžšαž½αž˜β€‹αž˜αžΆαž“β€‹αž‘αŸ†αž αŸ†β€‹αž˜αž·αž“β€‹αž‚αŸ’αžšαž”αŸ‹β€‹αž‚αŸ’αžšαžΆαž“αŸ‹ αž€αžΆαžšβ€‹αž”αžΆαžαŸ‹β€‹αž”αž„αŸ‹β€‹αž€αžΆαžšβ€‹αžαž—αŸ’αž‡αžΆαž”αŸ‹ αž€αžΆαžšβ€‹αž–αŸ’αž™αž½αžšβ€‹αžŸαž˜αŸαž™β€‹αž‡αžΆαžŠαžΎαž˜αŸ”

αž€αŸ†αž αž»αžŸβ€‹αž‘αžΌαž‡αžΈαžαž›β€‹αžšαž½αž˜β€‹αž˜αžΆαž“β€‹αžŠαžΌαž…β€‹αž‡αžΆβ€‹αž€αžΆαžšβ€‹αžšαŸ†αž›αŸ„αž—β€‹αž›αžΎβ€‹αž‚αŸ’αžšαžΆαž”αŸ‹αž…αž»αž…β€‹αžαžΆαžšαžΆαž„ αžœαžαŸ’αžαž»β€‹αž˜αž·αž“β€‹αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ αž€αž„αŸ’αžœαŸ‡β€‹αž€αžΆαžšβ€‹αž…αžΌαž›β€‹αž”αŸ’αžšαžΎβ€‹αžœαžαŸ’αžαž»β€‹αž‡αžΆαžŠαžΎαž˜αŸ”
αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž–αŸαž›αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αž·αž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‘αžΆαž“αŸ‹αž–αŸαž›αž‘αŸ αžœαžΆαž’αžΆαž…αž”αž„αŸ’αž€αž€αŸ”αž›αŸ”

αž€αŸ†αž αž»αžŸαžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž·αž“αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž™αžΌαžšαžŠαžΎαž˜αŸ’αž”αžΈαž‡αž½αžŸαž‡αž»αž›αŸ” ETL αž›αŸ’αž’αž’αžΆαž…αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž–αž½αž€αžœαžΆαž—αžΆαž‚αž…αŸ’αžšαžΎαž“αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αŸ”

αž€αŸ†αž αž»αžŸαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€ αž“αž·αž„αžŸαžΆαž€αž›αŸ’αž”αž„αž“αžΈαžαž·αžœαž·αž’αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž‘αž·αž“αŸ’αž“αž“αŸαž™ αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžœαŸ‚αž„αžšαž€αž”αŸ’αžšαž—αž–αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αž‡αžΆαžšαžΏαž™αŸ—αž“αžΆαŸ†αž±αŸ’αž™αž˜αžΆαž“αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž“αž·αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž–αžΆαž€αŸ‹αž€αžŽαŸ’αžαžΆαž›αž“αŸƒαž”αž‰αŸ’αž αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αžΊαž‘αžΆαž€αŸ‹αž‘αž„αž‘αŸ…αž“αžΉαž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” 48% αž“αŸƒαž€αŸ†αž αž»αžŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αžΊαž‡αžΆαž€αŸ†αž αž»αžŸαžŸαžΆαž˜αž‰αŸ’αž‰αŸ”
αž˜αž½αž™αž—αžΆαž‚αž”αžΈαž“αŸƒαž”αž‰αŸ’αž αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αžΊαž‘αžΆαž€αŸ‹αž‘αž„αž‘αŸ…αž“αžΉαž„αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαž€αžΆαžšαž•αŸ’αž‘αž»αž€αž¬αž‚αŸ†αžšαžΌ αž‡αžΆαž„αž–αžΆαž€αŸ‹αž€αžŽαŸ’αžαžΆαž›αž“αŸƒαž€αŸ†αž αž»αžŸαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž‚αžΊαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αŸ”

αž αžΎαž™αžαž·αž…αž‡αžΆαž„αž˜αž½αž™αž—αžΆαž‚αž”αž½αž“αž“αŸƒαž”αž‰αŸ’αž αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αžΊαž‘αžΆαž€αŸ‹αž‘αž„αž‘αŸ…αž“αžΉαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž–αŸαž›αž—αžΆαžšαž€αž·αž…αŸ’αž… αžŠαŸ‚αž› 18% αž‚αžΊαž‡αžΆαž€αŸ†αž αž»αžŸαžŸαžΆαž˜αž‰αŸ’αž‰αŸ”

αž‡αžΆαž‘αžΌαž‘αŸ… 22% αž“αŸƒαž€αŸ†αž αž»αžŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž›αž€αžΎαžαž‘αžΎαž„αž‚αžΊαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰ αž αžΎαž™αž€αžΆαžšαž€αŸ‚αžαž˜αŸ’αžšαžΌαžœαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž‘αžΆαž˜αž‘αžΆαžšαž€αžΆαžšαž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹ αž“αž·αž„αž–αŸαž›αžœαŸαž›αžΆαž…αŸ’αžšαžΎαž“αž”αŸ†αž•αž»αžαŸ” αž–αž½αž€αžœαžΆαž€αžΎαžαž‘αžΎαž„αž”αŸ’αžšαž αŸ‚αž›αž˜αŸ’αžαž„αž€αŸ’αž“αž»αž„αž˜αž½αž™αžŸαž”αŸ’αžαžΆαž αŸαŸ” αž…αŸ†αžŽαŸ‚αž€β€‹αž―β€‹αž€αŸ†αž αž»αžŸβ€‹αžŸαžΆαž˜αž‰αŸ’αž‰β€‹αž€αžΎαžβ€‹αž‘αžΎαž„β€‹αžŸαŸ’αž‘αžΎαžšβ€‹αžšαžΆαž›αŸ‹β€‹αžαŸ’αž„αŸƒαŸ”

αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš ETL αž“αžΉαž„αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž‘αžΈαžαžΆαŸ†αž„αž€αŸ†αž αž»αžŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αž±αŸ’αž™αž”αžΆαž“αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαžαžΆαž˜αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž”αžΆαž“ αž αžΎαž™αžαŸ’αžšαžΌαžœαž€αžΆαžšαž–αŸαž›αžœαŸαž›αžΆαž’αž”αŸ’αž”αž”αžšαž˜αžΆαžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžœαŸ‚αž„αžšαž€αž”αŸ’αžšαž—αž–αž“αŸƒαž”αž‰αŸ’αž αžΆαŸ”

αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž”αŸ’αžšαž€αž”αžŠαŸ„αž™αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–

αžαžΎαžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αžƒαžΎαž‰αž’αŸ’αžœαžΈαžαŸ’αž›αŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™ ETL?

αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš ETL αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΌαž…αž˜αž½αž™
αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ - αž“αŸ…αž–αŸαž›αž‚αžΆαžαŸ‹αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαž„αžΆαžšαŸ”
αž”αŸ’αžšαž—αž– - αž”αŸ’αžšαž—αž–αž‘αž·αž“αŸ’αž“αž“αŸαž™,
αžŸαŸ’αžšαž‘αžΆαž”αŸ‹ - αžαžΎαž€αž˜αŸ’αžšαž·αžαž“αŸƒαž€αžΆαžšαž•αŸ’αž‘αž»αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αž»αž€,
αžˆαŸ’αž˜αŸ„αŸ‡αž€αžΆαžšαž„αžΆαžš ETL - αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž•αŸ’αž‘αž»αž€αž‘αžΎαž„αžŠαŸ‚αž›αž˜αžΆαž“αž‡αŸ†αž αžΆαž“αžαžΌαž…αŸ—αž‡αžΆαž…αŸ’αžšαžΎαž“
αž›αŸαžαž‡αŸ†αž αžΆαž“ - αž…αŸ†αž“αž½αž“αž‡αŸ†αž αžΆαž“αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αž
αž‡αž½αžšαžŠαŸ‚αž›αžšαž„αž•αž›αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹ - αžαžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαž½αž…αž αžΎαž™
αžšαž™αŸˆαž–αŸαž›αžœαž·αž“αžΆαž‘αžΈ - αžαžΎαžœαžΆαžαŸ’αžšαžΌαžœαž…αŸ†αžŽαžΆαž™αž–αŸαž›αž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“,
αžŸαŸ’αžαžΆαž“αž—αžΆαž– - αžαžΆαžαžΎαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž›αŸ’αž’αž¬αž’αžαŸ‹αŸ– αž™αž›αŸ‹αž–αŸ’αžšαž˜, αž€αŸ†αž αž»αžŸ, αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš, αž–αŸ’αž™αž½αžš
សអរ - αžŸαžΆαžšαž‡αŸ„αž‚αž‡αŸαž™αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž¬αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž€αŸ†αž αž»αžŸαŸ”

αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆ αž’αŸ’αž“αž€αž’αžΆαž…αž•αŸ’αž‰αžΎαž’αŸŠαžΈαž˜αŸ‚αž›αŸ” αžŸαŸ†αž”αž»αžαŸ’αžšαž‘αŸ…αžŸαž˜αžΆαž‡αž·αž€αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž·αž“αž˜αžΆαž“αž€αŸ†αž αž»αžŸαž‘αŸαž“αŸ„αŸ‡αž›αž·αžαž·αžαž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‘αŸαŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž˜αžΆαž“αž€αŸ†αž αž»αžŸ αž‘αžΈαžαžΆαŸ†αž„αž“αŸƒαž§αž”αŸ’αž”αžαŸ’αžαž·αž αŸαžαž»αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰αž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹αŸ”

αž‡αž½αž“αž€αžΆαž›αžœαžΆαž€αžΎαžαž‘αžΎαž„αžαžΆαž§αž”αž€αžšαžŽαŸαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžαŸ’αž›αž½αž“αž―αž„αž˜αž·αž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αŸαŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž‚αŸαž’αžΆαž…αž αŸ…αž‘αž·αžŠαŸ’αž‹αž—αžΆαž– (αž˜αžΎαž›) αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αžŠαŸ„αž™αžˆαžšαž›αžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŠαŸ‚αž›αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αŸ”

αžαžΆαžšαžΆαž„αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™ ETL

αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš ETL αžαžΆαžšαžΆαž„αž˜αž½αž™ αž“αž·αž„αž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž˜αž½αž™αž‚αžΊαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž αžΎαž™αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… αž€αžΆαžšαž•αŸ’αž‘αž»αž€αžαž·αž…αžαž½αž…αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαž‚αŸ†αžšαžΌαžŠαžΎαž˜αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ sqlite αŸ”

αžαžΆαžšαžΆαž„ DDL

CREATE TABLE UTL_JOB_STATUS (
/* Table for logging of job execution log. Important that the job has the steps ETL_START and ETL_END or ETL_ERROR */
  UTL_JOB_STATUS_ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  SID               INTEGER NOT NULL DEFAULT -1, /* Session Identificator. Unique for every Run of job */
  LOG_DT            INTEGER NOT NULL DEFAULT 0,  /* Date time */
  LOG_D             INTEGER NOT NULL DEFAULT 0,  /* Date */
  JOB_NAME          TEXT NOT NULL DEFAULT 'N/A', /* Job name like JOB_STG2DM_GEO */
  STEP_NAME         TEXT NOT NULL DEFAULT 'N/A', /* ETL_START, ... , ETL_END/ETL_ERROR */
  STEP_DESCR        TEXT,                        /* Description of task or error message */
  UNIQUE (SID, JOB_NAME, STEP_NAME)
);
INSERT INTO UTL_JOB_STATUS (UTL_JOB_STATUS_ID) VALUES (-1);

αž˜αžΎαž›/αžšαžΆαž™αž€αžΆαžšαžŽαŸ DDL

CREATE VIEW IF NOT EXISTS UTL_JOB_STATUS_V
AS /* Content: Package Execution Log for last 3 Months. */
WITH SRC AS (
  SELECT LOG_D,
    LOG_DT,
    UTL_JOB_STATUS_ID,
    SID,
	CASE WHEN INSTR(JOB_NAME, 'FTP') THEN 'TRANSFER' /* file transfer */
	     WHEN INSTR(JOB_NAME, 'STG') THEN 'STAGE' /* stage */
	     WHEN INSTR(JOB_NAME, 'CLS') THEN 'CLEANSING' /* cleansing */
	     WHEN INSTR(JOB_NAME, 'DIM') THEN 'DIMENSION' /* dimension */
	     WHEN INSTR(JOB_NAME, 'FCT') THEN 'FACT' /* fact */
		 WHEN INSTR(JOB_NAME, 'ETL') THEN 'STAGE-MART' /* data mart */
	     WHEN INSTR(JOB_NAME, 'RPT') THEN 'REPORT' /* report */
	     ELSE 'N/A' END AS LAYER,
	CASE WHEN INSTR(JOB_NAME, 'ACCESS') THEN 'ACCESS LOG' /* source */
	     WHEN INSTR(JOB_NAME, 'MASTER') THEN 'MASTER DATA' /* source */
	     WHEN INSTR(JOB_NAME, 'AD-HOC') THEN 'AD-HOC' /* source */
	     ELSE 'N/A' END AS SOURCE,
    JOB_NAME,
    STEP_NAME,
    CASE WHEN STEP_NAME='ETL_START' THEN 1 ELSE 0 END AS START_FLAG,
    CASE WHEN STEP_NAME='ETL_END' THEN 1 ELSE 0 END AS END_FLAG,
    CASE WHEN STEP_NAME='ETL_ERROR' THEN 1 ELSE 0 END AS ERROR_FLAG,
    STEP_NAME || ' : ' || STEP_DESCR AS STEP_LOG,
	SUBSTR( SUBSTR(STEP_DESCR, INSTR(STEP_DESCR, '***')+4), 1, INSTR(SUBSTR(STEP_DESCR, INSTR(STEP_DESCR, '***')+4), '***')-2 ) AS AFFECTED_ROWS
  FROM UTL_JOB_STATUS
  WHERE datetime(LOG_D, 'unixepoch') >= date('now', 'start of month', '-3 month')
)
SELECT JB.SID,
  JB.MIN_LOG_DT AS START_DT,
  strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) AS LOG_DT,
  JB.SOURCE,
  JB.LAYER,
  JB.JOB_NAME,
  CASE
  WHEN JB.ERROR_FLAG = 1 THEN 'ERROR'
  WHEN JB.ERROR_FLAG = 0 AND JB.END_FLAG = 0 AND strftime('%s','now') - JB.MIN_LOG_DT > 0.5*60*60 THEN 'HANGS' /* half an hour */
  WHEN JB.ERROR_FLAG = 0 AND JB.END_FLAG = 0 THEN 'RUNNING'
  ELSE 'OK'
  END AS STATUS,
  ERR.STEP_LOG     AS STEP_LOG,
  JB.CNT           AS STEP_CNT,
  JB.AFFECTED_ROWS AS AFFECTED_ROWS,
  strftime('%d.%m.%Y %H:%M', datetime(JB.MIN_LOG_DT, 'unixepoch')) AS JOB_START_DT,
  strftime('%d.%m.%Y %H:%M', datetime(JB.MAX_LOG_DT, 'unixepoch')) AS JOB_END_DT,
  JB.MAX_LOG_DT - JB.MIN_LOG_DT AS JOB_DURATION_SEC
FROM
  ( SELECT SID, SOURCE, LAYER, JOB_NAME,
           MAX(UTL_JOB_STATUS_ID) AS UTL_JOB_STATUS_ID,
           MAX(START_FLAG)       AS START_FLAG,
           MAX(END_FLAG)         AS END_FLAG,
           MAX(ERROR_FLAG)       AS ERROR_FLAG,
           MIN(LOG_DT)           AS MIN_LOG_DT,
           MAX(LOG_DT)           AS MAX_LOG_DT,
           SUM(1)                AS CNT,
           SUM(IFNULL(AFFECTED_ROWS, 0)) AS AFFECTED_ROWS
    FROM SRC
    GROUP BY SID, SOURCE, LAYER, JOB_NAME
  ) JB,
  ( SELECT UTL_JOB_STATUS_ID, SID, JOB_NAME, STEP_LOG
    FROM SRC
    WHERE 1 = 1
  ) ERR
WHERE 1 = 1
  AND JB.SID = ERR.SID
  AND JB.JOB_NAME = ERR.JOB_NAME
  AND JB.UTL_JOB_STATUS_ID = ERR.UTL_JOB_STATUS_ID
ORDER BY JB.MIN_LOG_DT DESC, JB.SID DESC, JB.SOURCE;

SQL αž€αŸ†αž–αž»αž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαžαžΎαžœαžΆαž’αžΆαž…αž‘αŸ…αžšαž½αž…αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž›αŸαžαžŸαž˜αŸαž™αžαŸ’αž˜αžΈαŸ”

SELECT SUM (
  CASE WHEN start_job.JOB_NAME IS NOT NULL AND end_job.JOB_NAME IS NULL /* existed job finished */
	    AND NOT ( 'y' = 'n' ) /* force restart PARAMETER */
       THEN 1 ELSE 0
  END ) AS IS_RUNNING
  FROM
    ( SELECT 1 AS dummy FROM UTL_JOB_STATUS WHERE sid = -1) d_job
  LEFT OUTER JOIN
    ( SELECT JOB_NAME, SID, 1 AS dummy
      FROM UTL_JOB_STATUS
      WHERE JOB_NAME = 'RPT_ACCESS_LOG' /* job name PARAMETER */
	    AND STEP_NAME = 'ETL_START'
      GROUP BY JOB_NAME, SID
    ) start_job /* starts */
  ON d_job.dummy = start_job.dummy
  LEFT OUTER JOIN
    ( SELECT JOB_NAME, SID
      FROM UTL_JOB_STATUS
      WHERE JOB_NAME = 'RPT_ACCESS_LOG'  /* job name PARAMETER */
	    AND STEP_NAME in ('ETL_END', 'ETL_ERROR') /* stop status */
      GROUP BY JOB_NAME, SID
    ) end_job /* ends */
  ON start_job.JOB_NAME = end_job.JOB_NAME
     AND start_job.SID = end_job.SID

αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž“αŸƒαžαžΆαžšαžΆαž„αŸ–

  • αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž“αž·αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž“αžΈαžαž·αžœαž·αž’αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αžšαžΌαžœαžαŸ‚αž’αž“αž»αžœαžαŸ’αžαžαžΆαž˜αž‡αŸ†αž αžΆαž“ ETL_START αž“αž·αž„ ETL_END
  • αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž˜αžΆαž“αž€αŸ†αž αž»αžŸ αž‡αŸ†αž αžΆαž“ ETL_ERROR αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαžšαž”αžŸαŸ‹αžœαžΆαž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαž
  • αž…αŸ†αž“αž½αž“αž“αŸƒαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‚αž½αžšαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αž›αž·αž… αž§αž‘αžΆαž αžšαžŽαŸαž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαž‰αŸ’αž‰αžΆαž•αŸ’αž€αžΆαž™
  • αž“αžΈαžαž·αžœαž·αž’αžΈαžŠαžΌαž…αž‚αŸ’αž“αžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αŸ’αž“αž»αž„αž–αŸαž›αžαŸ‚αž˜αž½αž™αž‡αžΆαž˜αž½αž™αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš force_restart=y αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αžœαžΆαž›αŸαžαžŸαž˜αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸαž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ‚αž“αžΈαžαž·αžœαž·αž’αžΈαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹
  • αž€αŸ’αž“αž»αž„β€‹αžšαž”αŸ€αž”β€‹αž’αž˜αŸ’αž˜αžαžΆ αž’αŸ’αž“αž€β€‹αž˜αž·αž“β€‹αž’αžΆαž…β€‹αžŠαŸ†αžŽαžΎαžšβ€‹αž€αžΆαžšβ€‹αžŠαŸ†αžŽαžΎαžšβ€‹αž€αžΆαžšβ€‹αž‘αž·αž“αŸ’αž“αž“αŸαž™β€‹αžŠαžΌαž…β€‹αž‚αŸ’αž“αžΆβ€‹αžŸαŸ’αžšαž”β€‹αž‚αŸ’αž“αžΆβ€‹αž”αžΆαž“β€‹αž‘αŸαŸ”

αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžαžΆαžšαžΆαž„αž˜αžΆαž“αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  • αž‘αž‘αž½αž›αž”αžΆαž“αž›αŸαžαžœαž‚αŸ’αž‚αž“αŸƒαž“αžΈαžαž·αžœαž·αž’αžΈ ETL αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš
  • αž”αž‰αŸ’αž…αžΌαž›αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αž‘αŸ…αž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„
  • αž‘αž‘αž½αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž‡αŸ„αž‚αž‡αŸαž™αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αŸƒαž“αžΈαžαž·αžœαž·αž’αžΈ ETL

αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαžΌαž…αž‡αžΆ Oracle ឬ Postgres αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž‡αžΆαž˜αž»αžαž„αžΆαžšαžŠαŸ‚αž›αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž€αž‡αžΆαž˜αž½αž™αŸ” sqlite αž‘αžΆαž˜αž‘αžΆαžšαž™αž“αŸ’αžαž€αžΆαžšαžαžΆαž„αž€αŸ’αžšαŸ… αž αžΎαž™αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž‚αŸ†αžšαžΌαžŠαžΎαž˜αž“αŸ…αž€αŸ’αž“αž»αž„ PHP.

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αžŸαžΆαžšαž€αŸ†αž αž»αžŸαž“αŸ…αž€αŸ’αž“αž»αž„αž§αž”αž€αžšαžŽαŸαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαžΎαžšαžαž½αž“αžΆαž‘αžΈαž™αŸ‰αžΆαž„αžŸαŸ†αžαžΆαž“αŸ‹αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž–αž·αž”αžΆαž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαž αŸ…αž–αž½αž€αž‚αŸαžαžΆαž›αŸ’αž’αž”αŸ†αž•αž»αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž˜αžΌαž›αž αŸαžαž»αž“αŸƒαž”αž‰αŸ’αž αžΆαž”αžΆαž“αž™αŸ‰αžΆαž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸαŸ” αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž…αŸ†αž“αž½αž“αž“αžΈαžαž·αžœαž·αž’αžΈαžˆαžΆαž“αžŠαž›αŸ‹αž˜αž½αž™αžšαž™ αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ’αžšαŸ‚αž‘αŸ…αž‡αžΆαž‚αž˜αŸ’αžšαŸ„αž„αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αŸ”

αž’αžαŸ’αžαž”αž‘αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸ‚αž›αž’αžΆαž…αž€αžΎαžαž˜αžΆαž“αž…αŸ†αž–αŸ„αŸ‡αž”αž‰αŸ’αž αžΆαž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž‡αžΆαž‚αŸ†αžšαžΌαŸ” αž‚αŸ†αžšαžΌαžƒαŸ’αž›αžΆαŸ†αž„αžαžΌαž…αž‘αžΆαŸ†αž„αž˜αžΌαž›αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„ gitlab αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ SQLite PHP ETL.

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹