{"id":15536,"date":"2019-03-24T19:56:35","date_gmt":"2019-03-24T18:56:35","guid":{"rendered":"https:\/\/scriptfactory.pl\/blog\/?p=15536"},"modified":"2022-02-17T09:47:10","modified_gmt":"2022-02-17T08:47:10","slug":"wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record","status":"publish","type":"post","link":"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/","title":{"rendered":"Data Warehouse i przetwarzanie plik\u00f3w"},"content":{"rendered":"\n<h2 id=\"mce_0\">Wprowadzenie:<\/h2>\n\n\n\n<p>Przed Wami kolejny z serii artyku\u0142\u00f3w po\u015bwi\u0119conych analizie \u015brodowisk w chmurze, takich jak <a href=\"https:\/\/cloud.google.com\">Google<\/a>, <a href=\"https:\/\/aws.amazon.com\">AWS<\/a>, <a href=\"https:\/\/azure.microsoft.com\/pl-pl\/\">Azure <\/a>pod kontem u\u017cyteczno\u015bci w obr\u00f3bce danych.<\/p>\n\n\n\n<p>Skupimy si\u0119 w nim na \u015brodowisku Azure, a konkretnie na Azure Data Warehouse i us\u0142udze Azure <a href=\"https:\/\/azure.microsoft.com\/pl-pl\/services\/storage\/blobs\/\">Storage <\/a>wykorzystanej w celu analizy plik\u00f3w CDR (call detail record), (podobnie jak <a href=\"https:\/\/scriptfactory.pl\/blog\/2019\/03\/20\/wykorzystanie-google-bigquery-w-przetwarzaniu-cdr-call-detail-record\/\">w poprzednim artykule<\/a> dotycz\u0105cym \u015brodowiska Google).<\/p>\n\n\n\n<p>Postaramy si\u0119 odpowiedzie\u0107 na pytania:<\/p>\n\n\n\n<ul><li>jak trudno jest utworzy\u0107 \u015brodowisko pozwalaj\u0105ce procesowa\u0107 pliki CDR (struktura opisana poni\u017cej) ze 100 mln rekord\u00f3w,<\/li><li>jaki jest koszt platformy wykorzystywanej w trakcie naszego testu,<\/li><li>jaka jest wydajno\u015b\u0107 platformy<\/li><\/ul>\n\n\n\n<h2 id=\"mce_1\">Use Case: <\/h2>\n\n\n\n<p>Jako\nprzyk\u0142ad u\u017cycia wybrali\u015bmy przetwarzanie plik\u00f3w zwanych CDR, czyli call detail\nrecord. S\u0105 to pliki cz\u0119sto wykorzystywane w bran\u017cy telekomunikacyjnej. Ich\nformaty mog\u0105 by\u0107 najr\u00f3\u017cniejsze, nie ma te\u017c jednego przyj\u0119tego standardu. Na\npotrzeby tego przyk\u0142adu przygotowali\u015bmy nast\u0119puj\u0105cy format plik\u00f3w: <\/p>\n\n\n\n<p>Id INT,\nCustomerId INT, DestinationPhone INT, CallDate DATE, CallTime STRING, Duration\nINT, Network STRING, Location STRING, NetAmount NUMBER, Amount NUMBER \u2013\nNetAmount i Amount s\u0105 przechowywane w pliku \u017ar\u00f3d\u0142owym jako INT, jednak\nodpowiadaj\u0105 liczbie o precyzji 2 miejsc po przecinku, np. 101 oznacza 1.01.<\/p>\n\n\n\n<p>Przyk\u0142adowe dane:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"953\" height=\"63\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/6a-1.png\" alt=\"\" class=\"wp-image-15544\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/6a-1.png 953w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/6a-1-300x20.png 300w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/6a-1-768x51.png 768w\" sizes=\"(max-width: 953px) 100vw, 953px\" \/><\/figure><\/div>\n\n\n\n<p>Przeprowadzimy na nich proste agregacje w celu sprawdzenia wydajno\u015bci \u015brodowiska i oszacowania, jak skomplikowane b\u0119dzie wdro\u017cenie nowej platformy. Azure Data Warehouse jest pomys\u0142em Microsoftu na zaimplementowanie koncepcji rozproszonej bazy danych, analogicznej do Teradata. Aplikuje ona <a href=\"https:\/\/docs.microsoft.com\/pl-pl\/azure\/sql-data-warehouse\/massively-parallel-processing-mpp-architecture\">MPP &#8211; massive parallel processing<\/a>. Architektura rozwi\u0105zania sk\u0142ada si\u0119 z compute nod\u00f3w (ich liczba zale\u017cy od poziomu us\u0142ugi wybranej w panelu Azure &#8211; od 1 do 60) oraz jednego control noda. Warstw\u0105 do przechowywania danych jest Azure Storage. <\/p>\n\n\n\n<p>Ka\u017cde\nzapytanie SQL wys\u0142ane do control node zostanie zamienione na mniejsze zadania\ndystrybuowane mi\u0119dzy dost\u0119pne compute nody. W przypadku, kiedy zaistnieje\nkonieczno\u015b\u0107 przeniesienia danych mi\u0119dzy nimi (np. kiedy jest r\u00f3\u017cna dystrybucja\ndanych w dw\u00f3ch tabelach \u0142\u0105czonych) uruchamia si\u0119 us\u0142uga DMS (Data Movement\nService).<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"440\" height=\"339\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/massively-parallel-processing-mpp-architecture.png\" alt=\"\" class=\"wp-image-15545\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/massively-parallel-processing-mpp-architecture.png 440w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/massively-parallel-processing-mpp-architecture-300x231.png 300w\" sizes=\"(max-width: 440px) 100vw, 440px\" \/><figcaption>Strona \u017ar\u00f3d\u0142owa:  <br><a href=\"https:\/\/docs.microsoft.com\/pl-pl\/azure\/sql-data-warehouse\/massively-parallel-processing-mpp-architecture\">https:\/\/docs.microsoft.com\/pl-pl\/azure\/sql-data-warehouse\/massively-parallel-processing-mpp-architecture<\/a> <br><\/figcaption><\/figure><\/div>\n\n\n\n<p>Azure Storage &#8211; a konkretnie blob storage u\u017cywany w naszym przyk\u0142adzie &#8211; jest us\u0142ug\u0105 rozproszonego przechowywania plik\u00f3w analogiczn\u0105 do Hadoop HDFS b\u0105d\u017a Google Cloud Storage. Dystrybucja plik\u00f3w mi\u0119dzy wieloma dost\u0119pnymi serwerami zapewnia ich bezpiecze\u0144stwo (pliki s\u0105 replikowane na r\u00f3\u017cne zasoby), szybko\u015b\u0107 (czytanie odbywa si\u0119 z wielu \u017ar\u00f3de\u0142 jednocze\u015bnie), pojemno\u015b\u0107, dystrybucj\u0119 danych mi\u0119dzy lokalizacjami.<\/p>\n\n\n\n<h2 id=\"mce_8\">Pierwsze kroki:<\/h2>\n\n\n\n<p>Aby zacz\u0105\u0107\nnasz\u0105 przygod\u0119 z platform\u0105 Azure nale\u017cy za\u0142o\u017cy\u0107 konto &#8211; i tutaj mamy dobr\u0105\nwiadomo\u015b\u0107 &#8211; Microsoft pozwala nam utworzy\u0107 darmowe konto pr\u00f3bne na 30 dni ze 170\nEUR do wykorzystania we wszystkich us\u0142ugach, jakie oferuje platforma Azure.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"566\" height=\"100\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/1-1.png\" alt=\"\" class=\"wp-image-15546\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/1-1.png 566w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/1-1-300x53.png 300w\" sizes=\"(max-width: 566px) 100vw, 566px\" \/><\/figure>\n\n\n\n<p>W celu skorzystania z oferty nale\u017cy wype\u0142ni\u0107 dane osoby prywatnej bad\u017a firmy oraz dane billingowe. Po udanej rejestracji mo\u017cemy przyst\u0105pi\u0107 do uruchamiania us\u0142ug &#8211; logujemy si\u0119 wi\u0119c na adres<a href=\"https:\/\/portal.azure.com\/\"> panelu sterowania<\/a>. Nast\u0119pnie nale\u017cy w naszej subskrypcji stworzy\u0107 grup\u0119 zasob\u00f3w \u2013 nasz\u0105 nazwali\u015bmy <strong>Demo<\/strong>: <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"1006\" height=\"496\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/5-1.png\" alt=\"\" class=\"wp-image-15547\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/5-1.png 1006w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/5-1-300x148.png 300w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/5-1-768x379.png 768w\" sizes=\"(max-width: 1006px) 100vw, 1006px\" \/><\/figure><\/div>\n\n\n\n<h2 id=\"mce_25\">Azure Storage:<\/h2>\n\n\n\n<p>Aby ustawi\u0107 us\u0142ug\u0119 Azure Storage nale\u017cy z menu wybra\u0107 <strong>konta magazynu<\/strong>, a nast\u0119pnie <strong>Utw\u00f3rz konto magazynu<\/strong>. Poniewa\u017c nasz przyk\u0142ad nie wymaga specjalnych ustawie\u0144, wskazali\u015bmy konfiguracj\u0119 konta <strong>demodwhas<\/strong> na podstawie poni\u017cszych parametr\u00f3w. Istotna jest jednak lokalizacja (w kontek\u015bcie przechowywania np. danych osobowych), replikacja oraz wartswa dost\u0119pu &#8211; w celu uzyskania najlepszej wydajno\u015bci wybieramy <strong>Gor\u0105ca (Hot)<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"949\" height=\"416\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/6-1.png\" alt=\"\" class=\"wp-image-15548\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/6-1.png 949w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/6-1-300x132.png 300w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/6-1-768x337.png 768w\" sizes=\"(max-width: 949px) 100vw, 949px\" \/><\/figure><\/div>\n\n\n\n<p>Panel zarz\u0105dzania kontem magazynu wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"1024\" height=\"525\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/7-1024x525.png\" alt=\"\" class=\"wp-image-15549\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/7-1024x525.png 1024w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/7-300x154.png 300w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/7-768x394.png 768w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/7.png 1585w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>Interesuje nas sekcja <strong>Obiekty blob \u2013<\/strong> to tam b\u0119dziemy przechowywa\u0107 nasze pliki z danymi przed za\u0142adowaniem ich przy pomocy Polybase do us\u0142ugi Azure Data Warehouse. <\/p>\n\n\n\n<p>W celu wydzielenia odpowiednich zasob\u00f3w na nasze pliki w magazynie danych nale\u017cy stworzy\u0107 kontener:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"667\" height=\"321\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/8-1.png\" alt=\"\" class=\"wp-image-15550\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/8-1.png 667w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/8-1-300x144.png 300w\" sizes=\"(max-width: 667px) 100vw, 667px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"586\" height=\"310\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/9-1.png\" alt=\"\" class=\"wp-image-15551\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/9-1.png 586w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/9-1-300x159.png 300w\" sizes=\"(max-width: 586px) 100vw, 586px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"1024\" height=\"169\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/10-1-1024x169.png\" alt=\"\" class=\"wp-image-15552\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/10-1-1024x169.png 1024w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/10-1-300x49.png 300w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/10-1-768x127.png 768w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/10-1.png 1262w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>Microsoft opracowa\u0142 wygodne narz\u0119dzie do zarz\u0105dzania danymi znajduj\u0105cymi si\u0119 w Azure Storage \u2013 jest to Azure Storage Explorer, kt\u00f3rego mo\u017cna pobra\u0107 za darmo ze strony Microsoft:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"1024\" height=\"441\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/11-1-1024x441.png\" alt=\"\" class=\"wp-image-15553\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/11-1-1024x441.png 1024w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/11-1-300x129.png 300w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/11-1-768x331.png 768w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/11-1.png 1147w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>Aplikacja po zainstalowaniu wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"1024\" height=\"451\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/12-1-1024x451.png\" alt=\"\" class=\"wp-image-15554\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/12-1-1024x451.png 1024w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/12-1-300x132.png 300w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/12-1-768x338.png 768w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/12-1.png 1078w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>Na marginesie \u2013 Microsoft oferuje r\u00f3wnie\u017c narz\u0119dzia command line, takie jak AzCopy dost\u0119pne w \u015brodowisku Windows oraz Linux w celu automatyzacji operacji wysy\u0142ania i odbierania plik\u00f3w z Azure Storage.<\/p>\n\n\n\n<p>Aplikacja Azure Storage Explorer pos\u0142u\u017cy nam do za\u0142adowania plik\u00f3w do us\u0142ugi Azure Storage, w tym celu musimy po\u0142\u0105czy\u0107 aplikacj\u0119 do konta magazynu. Mo\u017cna to zrobi\u0107 na kilka sposob\u00f3w, najpro\u015bciej jednak b\u0119dzie \u2013 przy pomocy nazwy konta oraz klucza do us\u0142ugi. Nazwa konta to wcze\u015bniej utworzone konto magazynu, czyli demodwhas, klucz znajduje si\u0119 w danych kontenera obiektu blob, jest to unikalny, d\u0142ugi, sk\u0142adaj\u0105cy si\u0119 z du\u017cej liczby losowych znak\u00f3w tekst.<\/p>\n\n\n\n<p>Przyk\u0142ad konfiguracji poni\u017cej:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"1024\" height=\"365\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/13-1-1024x365.png\" alt=\"\" class=\"wp-image-15557\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/13-1-1024x365.png 1024w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/13-1-300x107.png 300w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/13-1-768x274.png 768w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/13-1.png 1314w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"748\" height=\"508\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/14-1.png\" alt=\"\" class=\"wp-image-15558\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/14-1.png 748w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/14-1-300x204.png 300w\" sizes=\"(max-width: 748px) 100vw, 748px\" \/><\/figure>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"909\" height=\"340\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/15-1.png\" alt=\"\" class=\"wp-image-15559\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/15-1.png 909w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/15-1-300x112.png 300w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/15-1-768x287.png 768w\" sizes=\"(max-width: 909px) 100vw, 909px\" \/><\/figure><\/div>\n\n\n\n<p>W ramach Azure Blob Storage mo\u017cemy tworzy\u0107 katalogi:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"636\" height=\"424\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/16-2.png\" alt=\"\" class=\"wp-image-15562\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/16-2.png 636w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/16-2-300x200.png 300w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/16-2-600x400.png 600w\" sizes=\"(max-width: 636px) 100vw, 636px\" \/><\/figure><\/div>\n\n\n\n<p>A do utworzonego katalogu mo\u017cemy &#8222;przeci\u0105gn\u0105\u0107&#8221; pliki z lokalnego katalogu:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"1024\" height=\"274\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/17-1-1024x274.png\" alt=\"\" class=\"wp-image-15563\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/17-1-1024x274.png 1024w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/17-1-300x80.png 300w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/17-1-768x205.png 768w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/17-1.png 1370w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"484\" height=\"484\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/18-1.png\" alt=\"\" class=\"wp-image-15564\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/18-1.png 484w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/18-1-150x150.png 150w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/18-1-300x300.png 300w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/18-1-80x80.png 80w\" sizes=\"(max-width: 484px) 100vw, 484px\" \/><\/figure><\/div>\n\n\n\n<p>Gdy mamy ju\u017c zasilon\u0105 us\u0142ug\u0119 Azure Storage, mo\u017cemy przej\u015b\u0107 do utworzenia Azure Data Warehouse.<\/p>\n\n\n\n<h2 id=\"mce_31\">Data Warehouse:<\/h2>\n\n\n\n<p>Aby m\u00f3c korzysta\u0107 z Azure Data Warehouse, nale\u017cy najpierw utworzy\u0107 serwer Data Warehouse, gdzie b\u0119dzie zlokalizowana baza danych, na kt\u00f3rej b\u0119dziemy wykonywa\u0107 testy. W tym celu w menu po lewej stronie wybieramy <strong>Utw\u00f3rz zas\u00f3b<\/strong> i w pasku wyszukiwania wpisujemy Data Warehouse. Otrzymujemy poni\u017cszy szablon:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"712\" height=\"823\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/2.png\" alt=\"\" class=\"wp-image-15566\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/2.png 712w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/2-260x300.png 260w\" sizes=\"(max-width: 712px) 100vw, 712px\" \/><\/figure><\/div>\n\n\n\n<p>Uzupe\u0142niamy informacje niezb\u0119dne do utworzenia instancji SQL, czyli nazw\u0119 bazy danych, poziom wydajno\u015bci, lokalizacj\u0119 oraz nazw\u0119 serwera, na kt\u00f3rym zostanie utworzona baza danych (oczywi\u015bcie istotne jest te\u017c, w jakiej subskrypcji i grupie zasob\u00f3w ona b\u0119dzie).<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"1024\" height=\"567\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/3-1-1024x567.png\" alt=\"\" class=\"wp-image-15568\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/3-1-1024x567.png 1024w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/3-1-300x166.png 300w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/3-1-768x425.png 768w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/3-1.png 1150w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>Po\nup\u0142yni\u0119ciu kilku, kilkunastu minut zostanie utworzony serwer wraz z baz\u0105\ndanych:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"579\" height=\"270\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/4-1.png\" alt=\"\" class=\"wp-image-15569\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/4-1.png 579w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/4-1-300x140.png 300w\" sizes=\"(max-width: 579px) 100vw, 579px\" \/><figcaption><br><\/figcaption><\/figure><\/div>\n\n\n\n<p>Aby m\u00f3c pod\u0142\u0105czy\u0107 si\u0119 do utworzonej instacji, nale\u017cy wybra\u0107 w panelu us\u0142ugi ustawienia zapory:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"243\" height=\"173\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/19-1.png\" alt=\"\" class=\"wp-image-15570\"\/><\/figure><\/div>\n\n\n\n<p>Nast\u0119pnie trzeba doda\u0107 IP naszej lokalizacji, w przeciwnym wypadku otrzymamy nast\u0119puj\u0105cy b\u0142\u0105d w aplikacji SQL Server Management Studio:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"635\" height=\"217\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/19_pre.png\" alt=\"\" class=\"wp-image-15571\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/19_pre.png 635w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/19_pre-300x103.png 300w\" sizes=\"(max-width: 635px) 100vw, 635px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"352\" height=\"183\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/20-1.png\" alt=\"\" class=\"wp-image-15572\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/20-1.png 352w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/20-1-300x156.png 300w\" sizes=\"(max-width: 352px) 100vw, 352px\" \/><\/figure><\/div>\n\n\n\n<p>Dane po\u0142\u0105czenia znajdziemy w panelu us\u0142ugi, podczas tworzenia zasobu podawali\u015bmy r\u00f3wnie\u017c nazw\u0119 i has\u0142o u\u017cytkownika, kt\u00f3ry jest naszym superuserem i dzi\u0119ki kt\u00f3remu mo\u017cemy tworzy\u0107 innych u\u017cytkownik\u00f3w i zarz\u0105dza\u0107 instancj\u0105. Aby m\u00f3c si\u0119 zalogowa\u0107 i poprawnie obs\u0142ugiwa\u0107 wszystkie funkcje Data Warehouse, musimy mie\u0107 SQL Server Management Studio w wersji wy\u017cszej lub r\u00f3wnej 17.0.<\/p>\n\n\n\n<p>Drzewo funkcji w Solution Explorer jest nieznacznie inne ni\u017c w standardowej edycji SQL Server i wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"349\" height=\"292\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/23.png\" alt=\"\" class=\"wp-image-15573\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/23.png 349w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/23-300x251.png 300w\" sizes=\"(max-width: 349px) 100vw, 349px\" \/><\/figure><\/div>\n\n\n\n<h2 id=\"troche-kodu\">Troch\u0119 kodu:<\/h2>\n\n\n\n<p>Mamy wi\u0119c gotowy serwer Data Warehouse wraz z baz\u0105 danych i danymi w \u015brodowisku chmury Azure.<\/p>\n\n\n\n<p>Aby z poziomu SQL mo\u017cna by\u0142o skorzysta\u0107 z danych znajduj\u0105cych si\u0119 na Azure Storage, nale\u017cy wykona\u0107 kilka wst\u0119pnych zapyta\u0144 SQL oraz utworzy\u0107 master key dla bazy:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>CREATE MASTER KEY;<\/p><\/blockquote>\n\n\n\n<p>Trzeba te\u017c stworzy\u0107 obiekt uprawnie\u0144 dla u\u017cytkownika, kt\u00f3ry b\u0119dzie przechowywa\u0142 klucz us\u0142ugi Azure Storage.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>CREATE DATABASE SCOPED CREDENTIAL BlobCred<br> WITH<br>     IDENTITY = 'demo-dwh-usr&#8217;,<br>     SECRET = '&lt;azure_storage_key&gt;&#8217;;<\/p><\/blockquote>\n\n\n\n<p>Nale\u017cy utworzy\u0107\nobiekt wi\u0105\u017c\u0105cy konto Azure Storage i uprawnienia opisane powy\u017cej.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>CREATE EXTERNAL DATA SOURCE DemoBlob<br> WITH<br> (<br>     TYPE = Hadoop,<br>     LOCATION = 'wasbs:\/\/demodwhblob@demodwhas.blob.core.windows.net&#8217;,<br>     CREDENTIAL = BlobCred<br> );<\/p><\/blockquote>\n\n\n\n<p>Musimy r\u00f3wnie\u017c zdefiniowa\u0107 format pliku, kt\u00f3ry b\u0119dziemy czyta\u0107 przy pomocy Data Warehouse. Plik zawiera nag\u0142\u00f3wki, wi\u0119c pierwsza linia z danymi to 2, separatorem jest &#8222;;&#8221; a plik ma ograniczon\u0105 struktur\u0119 ze zmienn\u0105 liczb\u0105 znak\u00f3w w rekordzie.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>CREATE EXTERNAL FILE FORMAT CSVFormat<br> WITH <br> (   <br>     FORMAT_TYPE = DELIMITEDTEXT,<br>     FORMAT_OPTIONS<br>     (   <br>         FIELD_TERMINATOR = &#8217;;&#8217;,<br>         USE_TYPE_DEFAULT = FALSE,<br>         FIRST_ROW = 2<br>     )<br> );<\/p><\/blockquote>\n\n\n\n<p>W celu\nodseparowania tabel zewn\u0119trznych (wyja\u015bnienie poni\u017cej) od tabel przechowywanych\nna serwerze SQL tworzymy dwa schematy:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>CREATE SCHEMA ext;<\/p><p>CREATE SCHEMA stg;<\/p><\/blockquote>\n\n\n\n<h2 id=\"troche-wiecej-kodu\">Troch\u0119 wi\u0119cej kodu:<\/h2>\n\n\n\n<p>Wr\u00f3\u0107my do poj\u0119cia tabeli zewn\u0119trznej. Microsoft w wersjach SQL Server 2016 wprowadzi\u0142 narz\u0119dzie zwane Polybase, by\u0142a to ich w\u0142asna implementacja koncepcji Hadoop Hive lub Google BigQuery &#8211; external table. Pozwala na czytanie plik\u00f3w z zasobu\/\u017ar\u00f3d\u0142a rozproszonego r\u00f3wnie\u017c w spos\u00f3b rozproszony (wielow\u0105tkowo, na wi\u0119cej ni\u017c jednej maszynie). Microsoft wprowadzi\u0142 tak\u017ce now\u0105 sk\u0142adni\u0119 w poleceniu CREATE TABLE -&gt; CREATE EXTERNAL TABLE. Tabele te nie s\u0105 zmaterializowane i s\u0105 czytane AdHoc (a w\u0142a\u015bciwie czytane s\u0105 pliki) w momencie wykonania zapytania SELECT. Nowe narz\u0119dzie pozwoli\u0142o zwi\u0119kszy\u0107 pr\u0119dko\u015b\u0107 i wydajno\u015b\u0107 czytania du\u017cej liczby plik\u00f3w, kieruj\u0105c si\u0119 bardziej w stron\u0119 ELT (extract-load-transform) zamiast ETL.<\/p>\n\n\n\n<p>Utw\u00f3rzmy wi\u0119c nasz\u0105 pierwsz\u0105 tabel\u0119 zewn\u0119trzn\u0105:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>CREATE EXTERNAL TABLE [ext].[cdr](<br>     Id INT,<br>     CallType VARCHAR(25),<br>     CustomerId INT,<br>     DestinationPhone INT,<br>     CallDate VARCHAR(30),<br>     CallTime VARCHAR(10),<br>     Duration INT,<br>     Network VARCHAR(25),<br>     Location VARCHAR(25),<br>     NetAmount VARCHAR(30),<br>     Amount VARCHAR(30)<br> )<br> WITH (LOCATION=&#8217;\/cdr\/stg\/&#8217;,   <br>     DATA_SOURCE = DemoBlob,  <br>     FILE_FORMAT = CSVFormat,<br>      REJECT_TYPE = VALUE,<br>     REJECT_VALUE = 0<br> );  <\/p><\/blockquote>\n\n\n\n<p>Utworzymy tabel\u0119 o logicznej strukturze opisanej powy\u017cej, ale z danymi w plikach p\u0142askich znajduj\u0105cych si\u0119 w lokalizacji \/cdr\/stg\/, opisanych formatem CSVFormat na Azure Storage wskazanym w obiekcie DemoBlob.<\/p>\n\n\n\n<p>Przyk\u0142ad drzewa obiekt\u00f3w po wykonaniu powy\u017cszych operacji:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"347\" height=\"494\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/24.png\" alt=\"\" class=\"wp-image-15574\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/24.png 347w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/24-211x300.png 211w\" sizes=\"(max-width: 347px) 100vw, 347px\" \/><\/figure><\/div>\n\n\n\n<h2 id=\"testujemy\">Testujemy:<\/h2>\n\n\n\n<p>Wykonajmy zapytanie:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>SELECT TOP 100 * FROM [ext].[cdr]<\/p><\/blockquote>\n\n\n\n<p>Wynik i czas zapytania:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"807\" height=\"252\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/25.png\" alt=\"\" class=\"wp-image-15576\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/25.png 807w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/25-300x94.png 300w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/25-768x240.png 768w\" sizes=\"(max-width: 807px) 100vw, 807px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"308\" height=\"42\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/25A.png\" alt=\"\" class=\"wp-image-15577\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/25A.png 308w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/25A-300x41.png 300w\" sizes=\"(max-width: 308px) 100vw, 308px\" \/><\/figure><\/div>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>SELECT COUNT(*) FROM [ext].[cdr]<\/p><\/blockquote>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"153\" height=\"74\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/26.png\" alt=\"\" class=\"wp-image-15578\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/26.png 153w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/26-150x74.png 150w\" sizes=\"(max-width: 153px) 100vw, 153px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"304\" height=\"39\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/26A.png\" alt=\"\" class=\"wp-image-15579\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/26A.png 304w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/26A-300x38.png 300w\" sizes=\"(max-width: 304px) 100vw, 304px\" \/><\/figure><\/div>\n\n\n\n<p>Sprawd\u017amy teraz, w jaki spos\u00f3b mo\u017cemy zmaterializowa\u0107 dane w instancji SQL przy pomocy zwyk\u0142ych tabel SQL:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>CREATE TABLE [stg].[cdr]<br> WITH<br> (<br>     DISTRIBUTION = HASH(Id)<br> ,   CLUSTERED COLUMNSTORE INDEX<br> )<br> AS<br> SELECT<br>     [Id], <br>     [CallType], <br>     [CustomerId], <br>     [DestinationPhone], <br>     CAST([CallDate] AS DATE) [CallDate], <br>     CAST([CallTime] AS TIME(0)) [CallTime], <br>     [Duration], <br>     [Network], <br>     [Location], <br>     CAST(REPLACE([NetAmount],&#8217;,&#8217;,&#8217;.&#8217;) AS DECIMAL(18,2)) [NetAmount], <br>     CAST(REPLACE([Amount],&#8217;,&#8217;,&#8217;.&#8217;) AS DECIMAL(18,2)) [Amount]<br> FROM ext.cdr<\/p><\/blockquote>\n\n\n\n<p>Korzystamy z CTAS &#8211; Create Table As Select, czyli tworzymy tabel\u0119 \u201ew locie\u201d. Metadane tabeli s\u0105 wnioskowane na podstawie typ\u00f3w danych zwr\u00f3conych w SELECT. W tym miejscu mamy te\u017c mo\u017cliwo\u015b\u0107 wykona\u0107 proste operacje CAST b\u0105d\u017a REPLACE w celu transformacji danych za\u0142adowanych do Azure Storage (zastosowanie podje\u015bcia ELT). Jedne z bardziej istotnych pozycji w zapytaniu to DISTRIBUTION = <a href=\"https:\/\/docs.microsoft.com\/pl-pl\/azure\/sql-data-warehouse\/sql-data-warehouse-tables-distribute\">HASH<\/a>(Id) , czyli rodzaj dystrybucji danych (mamy jeszcze do dyspozycji ROUND_ROBIN &#8211; czyli losowa dystrybucja, oraz REPLICATED, czyli ka\u017cdy compute node ma zreplikowane dane). Drug\u0105 istotn\u0105 pozycj\u0105 jest CLUSTERED COLUMNSTORE INDEX &#8211; okre\u015bla on typ przechowywania danych w tabeli, jak mo\u017cna si\u0119 domy\u015bli\u0107 w tym przypadku mamy do czynienia z przechowywaniem w postaci kolumnowej, mamy jeszcze mo\u017cliwo\u015b\u0107 u\u017cycia HEAP, czyli przechowujemy tabele w spos\u00f3b standardowy &#8211; wierszowy.<\/p>\n\n\n\n<p>Czas wykonania zapytania SQL CTAS:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"297\" height=\"33\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/27.png\" alt=\"\" class=\"wp-image-15580\"\/><\/figure><\/div>\n\n\n\n<p>Sprawd\u017amy wydajno\u015b\u0107 nowej tabeli:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>SELECT COUNT(*) FROM [stg].[cdr]<\/p><\/blockquote>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"297\" height=\"37\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/28.png\" alt=\"\" class=\"wp-image-15582\"\/><\/figure><\/div>\n\n\n\n<p>Proces agregacji jest znacznie kr\u00f3tszy w por\u00f3wnaniu do COUNT(*) na tabeli zewn\u0119trznej <\/p>\n\n\n\n<p>Wykonajmy r\u00f3wnie\u017c dwa poni\u017csze zapytania agreguj\u0105ce, jedno na tabeli zmaterializowanej, a drugie na tabeli zewn\u0119trznej:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>SELECT TOP 100 SUM(Duration) NbrOfSms,CustomerId <br> FROM stg.cdr<br> WHERE CallType = 'sms&#8217;<br> GROUP BY CustomerId<br> ORDER BY 1 DESC<\/p><\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>SELECT TOP 100 SUM(Duration) NbrOfSms,CustomerId <br> FROM ext.cdr<br> WHERE CallType = 'sms&#8217;<br> GROUP BY CustomerId<br> ORDER BY 1 DESC<\/p><\/blockquote>\n\n\n\n<p>Odpowiednio wyniki i wydajno\u015b\u0107:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"181\" height=\"275\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/29.png\" alt=\"\" class=\"wp-image-15583\"\/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"305\" height=\"32\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/29A.png\" alt=\"\" class=\"wp-image-15584\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/29A.png 305w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/29A-300x31.png 300w\" sizes=\"(max-width: 305px) 100vw, 305px\" \/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"183\" height=\"279\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/30.png\" alt=\"\" class=\"wp-image-15585\"\/><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" width=\"312\" height=\"35\" src=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/30A.png\" alt=\"\" class=\"wp-image-15586\" srcset=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/30A.png 312w, https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/30A-300x34.png 300w\" sizes=\"(max-width: 312px) 100vw, 312px\" \/><\/figure><\/div>\n\n\n\n<p>Jak wida\u0107 r\u00f3\u017cnica w czasie wykonania zapytania jest znacz\u0105ca.<\/p>\n\n\n\n<h4 id=\"mce_31\">Podsumowanie:<\/h4>\n\n\n\n<p>Odpowiedzmy sobie na pytania postawione na pocz\u0105tku artyku\u0142u<\/p>\n\n\n\n<ul><li>utworzenie \u015brodowiska jest proste i nie wymaga znacznej wiedzy technicznej, podstawowe \u015brodowisko pozwalaj\u0105ce nam na utworzenie pierwszych tabel czy zapyta\u0144 agreguj\u0105cych wymaga 1-1,5 h czasu.<\/li><li>koszt platformy jest niewielki &lt; 10 EUR, jednak trzeba zaznaczy\u0107, \u017ce billing w platformie Azure nie jest tak przejrzysty, jak w innych us\u0142ugach chmurowych. Microsoft potrafi obci\u0105\u017ca\u0107 kosztami za us\u0142ugi, z kt\u00f3rych ju\u017c nie korzystamy &#8211; jest tak np. z Azure Storage, gdzie mimo skasowania danych przez 7 nast\u0119pnych dni op\u0142ata za us\u0142ug\u0119 jest pobierana. Trzeba mie\u0107 r\u00f3wnie\u017c na uwadze, \u017ce w SQL Data      Warehouse tak\u017ce niejawnie p\u0142acimy za storage, co w praktyce daje      zdublowany rachunek za us\u0142ug\u0119.<\/li><li>aby koszt by\u0142 jak najni\u017cszy, skorzystali\u015bmy z minimalnych ustawie\u0144 Data Warehouse DW100c, w celu uzyskania zadowalaj\u0105cej wydajno\u015bci najlepiej przej\u015b\u0107 do us\u0142ug DW1000c &#8211; jednak to powoduje znaczny wzrost koszt\u00f3w. Wydajno\u015b\u0107 us\u0142ugi jest mniejsza ni\u017c innych rozwi\u0105za\u0144 chmurowych, kt\u00f3re prezentowali\u015bmy i b\u0119dziemy      prezentowa\u0107.<\/li><\/ul>\n\n\n\n<p>Niew\u0105tpliw\u0105 zalet\u0105 korzystania z platformy Microsoft Azure jest jej szybki rozw\u00f3j w ci\u0105gu ostatnich lat, a tak\u017ce dost\u0119pna mnogo\u015b\u0107 funkcji i opcji. Platforma wymaga jednak jeszcze pracy w obszarach stabilno\u015bci i przejrzystego billingowania. Jej prostota w u\u017cytkowaniu ma r\u00f3wnie\u017c du\u017ce znaczenie, wymieniony wy\u017cej Azure Data Warehouse korzysta z narz\u0119dzi dobrze ju\u017c znanych ka\u017cdemu deweloperowi BI, kt\u00f3ry mia\u0142 styczno\u015b\u0107 z Microsoft SQL Server. W tym zakresie Microsoft wyprzedza konkurencj\u0119. Koszt adaptacji dewelopera do nowego \u015brodowiska b\u0119dzie wi\u0119c minimalny.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wprowadzenie: Przed Wami kolejny z serii artyku\u0142\u00f3w po\u015bwi\u0119conych analizie \u015brodowisk w chmurze, takich jak Google, AWS, Azure pod kontem u\u017cyteczno\u015bci w obr\u00f3bce danych. Skupimy si\u0119 w nim na \u015brodowisku Azure, a konkretnie na Azure Data Warehouse i us\u0142udze Azure Storage wykorzystanej w celu analizy plik\u00f3w CDR (call detail record), (podobnie jak w poprzednim artykule dotycz\u0105cym \u015brodowiska Google). Postaramy si\u0119 odpowiedzie\u0107 na pytania: jak trudno jest utworzy\u0107 \u015brodowisko pozwalaj\u0105ce procesowa\u0107 pliki CDR (struktura opisana poni\u017cej) ze 100 mln rekord\u00f3w, jaki jest koszt platformy wykorzystywanej w trakcie naszego testu, jaka jest wydajno\u015b\u0107 platformy Use Case: Jako przyk\u0142ad u\u017cycia wybrali\u015bmy przetwarzanie plik\u00f3w zwanych CDR, czyli call detail record. S\u0105 to pliki cz\u0119sto wykorzystywane w bran\u017cy telekomunikacyjnej. Ich formaty mog\u0105 by\u0107 najr\u00f3\u017cniejsze, nie ma te\u017c jednego przyj\u0119tego standardu. Na potrzeby tego przyk\u0142adu przygotowali\u015bmy nast\u0119puj\u0105cy format plik\u00f3w: Id INT, CustomerId INT, DestinationPhone INT, CallDate DATE, CallTime STRING, Duration INT, Network STRING, Location STRING, NetAmount NUMBER, Amount NUMBER \u2013 NetAmount i Amount s\u0105 przechowywane w pliku \u017ar\u00f3d\u0142owym jako INT, jednak odpowiadaj\u0105 liczbie o precyzji 2 miejsc po przecinku, np. 101 oznacza 1.01. Przyk\u0142adowe dane: Przeprowadzimy na nich proste agregacje w celu sprawdzenia wydajno\u015bci \u015brodowiska i oszacowania, jak skomplikowane b\u0119dzie wdro\u017cenie nowej platformy. Azure Data Warehouse jest [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":15543,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[100,102,101,124],"tags":[96,99,104,93,79,103,97,77,81,98,95,94],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v18.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<meta name=\"description\" content=\"Przyk\u0142ad przetwarzania plik\u00f3w p\u0142askich w Azure Data Warehouse (zwanym obecnie Synapse). Dane to pliki tzw. CDR.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Data Warehouse i przetwarzanie plik\u00f3w - SCRIPT FACTORY | BI BLOG\" \/>\n<meta property=\"og:description\" content=\"Przyk\u0142ad przetwarzania plik\u00f3w p\u0142askich w Azure Data Warehouse (zwanym obecnie Synapse). Dane to pliki tzw. CDR.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/\" \/>\n<meta property=\"og:site_name\" content=\"SCRIPT FACTORY | BI BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2019-03-24T18:56:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-02-17T08:47:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/AzureDataWarehouse_COLOR-2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"537\" \/>\n\t<meta property=\"og:image:height\" content=\"274\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"Wojciech Zduniak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/scriptfactory.pl\/blog\/#website\",\"url\":\"https:\/\/scriptfactory.pl\/blog\/\",\"name\":\"SCRIPT FACTORY | BI BLOG\",\"description\":\"Blog techniczny pokazuj\u0105cy jak poradzi\u0107 sobie z najwi\u0119kszymi problemami\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/scriptfactory.pl\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/#primaryimage\",\"inLanguage\":\"pl-PL\",\"url\":\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/AzureDataWarehouse_COLOR-2.png\",\"contentUrl\":\"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/AzureDataWarehouse_COLOR-2.png\",\"width\":537,\"height\":274},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/#webpage\",\"url\":\"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/\",\"name\":\"Data Warehouse i przetwarzanie plik\u00f3w - SCRIPT FACTORY | BI BLOG\",\"isPartOf\":{\"@id\":\"https:\/\/scriptfactory.pl\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/#primaryimage\"},\"datePublished\":\"2019-03-24T18:56:35+00:00\",\"dateModified\":\"2022-02-17T08:47:10+00:00\",\"author\":{\"@id\":\"https:\/\/scriptfactory.pl\/blog\/#\/schema\/person\/e39ed2fd20838bb0d87220cc919e2f21\"},\"description\":\"Przyk\u0142ad przetwarzania plik\u00f3w p\u0142askich w Azure Data Warehouse (zwanym obecnie Synapse). Dane to pliki tzw. CDR.\",\"breadcrumb\":{\"@id\":\"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/scriptfactory.pl\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Data Warehouse i przetwarzanie plik\u00f3w\"}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/scriptfactory.pl\/blog\/#\/schema\/person\/e39ed2fd20838bb0d87220cc919e2f21\",\"name\":\"Wojciech Zduniak\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/scriptfactory.pl\/blog\/#personlogo\",\"inLanguage\":\"pl-PL\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5d954513663b7b760bcae861966c5069?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5d954513663b7b760bcae861966c5069?s=96&d=mm&r=g\",\"caption\":\"Wojciech Zduniak\"},\"description\":\"BI zajmuj\u0119 si\u0119 kilkana\u015bcie lat, od Microsoft po Teradat\u0119, od on-premise do cloud, od pojedy\u0144czych serwer\u00f3w po klastr\u00f3w obliczeniowych. Temat jest tak szeroki i ciekawy \u017ce postanowi\u0142em opisa\u0107 po kolei wszystko co wiem i z czym si\u0119 zetkn\u0105\u0142em. Mam nadzieje \u017ce b\u0119dzie Wam si\u0119 podoba\u0107 ta lektura :)\",\"url\":\"https:\/\/scriptfactory.pl\/blog\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"description":"Przyk\u0142ad przetwarzania plik\u00f3w p\u0142askich w Azure Data Warehouse (zwanym obecnie Synapse). Dane to pliki tzw. CDR.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/","og_locale":"pl_PL","og_type":"article","og_title":"Data Warehouse i przetwarzanie plik\u00f3w - SCRIPT FACTORY | BI BLOG","og_description":"Przyk\u0142ad przetwarzania plik\u00f3w p\u0142askich w Azure Data Warehouse (zwanym obecnie Synapse). Dane to pliki tzw. CDR.","og_url":"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/","og_site_name":"SCRIPT FACTORY | BI BLOG","article_published_time":"2019-03-24T18:56:35+00:00","article_modified_time":"2022-02-17T08:47:10+00:00","og_image":[{"width":537,"height":274,"url":"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/AzureDataWarehouse_COLOR-2.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"Wojciech Zduniak","Szacowany czas czytania":"18 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"https:\/\/scriptfactory.pl\/blog\/#website","url":"https:\/\/scriptfactory.pl\/blog\/","name":"SCRIPT FACTORY | BI BLOG","description":"Blog techniczny pokazuj\u0105cy jak poradzi\u0107 sobie z najwi\u0119kszymi problemami","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/scriptfactory.pl\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"ImageObject","@id":"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/#primaryimage","inLanguage":"pl-PL","url":"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/AzureDataWarehouse_COLOR-2.png","contentUrl":"https:\/\/scriptfactory.pl\/blog\/wp-content\/uploads\/2019\/03\/AzureDataWarehouse_COLOR-2.png","width":537,"height":274},{"@type":"WebPage","@id":"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/#webpage","url":"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/","name":"Data Warehouse i przetwarzanie plik\u00f3w - SCRIPT FACTORY | BI BLOG","isPartOf":{"@id":"https:\/\/scriptfactory.pl\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/#primaryimage"},"datePublished":"2019-03-24T18:56:35+00:00","dateModified":"2022-02-17T08:47:10+00:00","author":{"@id":"https:\/\/scriptfactory.pl\/blog\/#\/schema\/person\/e39ed2fd20838bb0d87220cc919e2f21"},"description":"Przyk\u0142ad przetwarzania plik\u00f3w p\u0142askich w Azure Data Warehouse (zwanym obecnie Synapse). Dane to pliki tzw. CDR.","breadcrumb":{"@id":"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/scriptfactory.pl\/blog\/azure\/wykorzystanie-azure-data-warehouse-w-przetwarzaniu-cdr-call-detail-record\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/scriptfactory.pl\/blog\/"},{"@type":"ListItem","position":2,"name":"Data Warehouse i przetwarzanie plik\u00f3w"}]},{"@type":"Person","@id":"https:\/\/scriptfactory.pl\/blog\/#\/schema\/person\/e39ed2fd20838bb0d87220cc919e2f21","name":"Wojciech Zduniak","image":{"@type":"ImageObject","@id":"https:\/\/scriptfactory.pl\/blog\/#personlogo","inLanguage":"pl-PL","url":"https:\/\/secure.gravatar.com\/avatar\/5d954513663b7b760bcae861966c5069?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5d954513663b7b760bcae861966c5069?s=96&d=mm&r=g","caption":"Wojciech Zduniak"},"description":"BI zajmuj\u0119 si\u0119 kilkana\u015bcie lat, od Microsoft po Teradat\u0119, od on-premise do cloud, od pojedy\u0144czych serwer\u00f3w po klastr\u00f3w obliczeniowych. Temat jest tak szeroki i ciekawy \u017ce postanowi\u0142em opisa\u0107 po kolei wszystko co wiem i z czym si\u0119 zetkn\u0105\u0142em. Mam nadzieje \u017ce b\u0119dzie Wam si\u0119 podoba\u0107 ta lektura :)","url":"https:\/\/scriptfactory.pl\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/scriptfactory.pl\/blog\/wp-json\/wp\/v2\/posts\/15536"}],"collection":[{"href":"https:\/\/scriptfactory.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scriptfactory.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scriptfactory.pl\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/scriptfactory.pl\/blog\/wp-json\/wp\/v2\/comments?post=15536"}],"version-history":[{"count":17,"href":"https:\/\/scriptfactory.pl\/blog\/wp-json\/wp\/v2\/posts\/15536\/revisions"}],"predecessor-version":[{"id":15678,"href":"https:\/\/scriptfactory.pl\/blog\/wp-json\/wp\/v2\/posts\/15536\/revisions\/15678"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/scriptfactory.pl\/blog\/wp-json\/wp\/v2\/media\/15543"}],"wp:attachment":[{"href":"https:\/\/scriptfactory.pl\/blog\/wp-json\/wp\/v2\/media?parent=15536"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scriptfactory.pl\/blog\/wp-json\/wp\/v2\/categories?post=15536"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scriptfactory.pl\/blog\/wp-json\/wp\/v2\/tags?post=15536"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}