Jak wykorzystałem Pythona do integracji z Amazon Redshift
Hurtownie danych (Warehouse) to jedna z najciekawszych form wykorzystania dużych zbiorów danych, która, co ważne, jest na zaawansowanym etapie praktycznej implementacji. W przeciwieństwie do wielu rozwiązań z zakresu Big Data, Warehouse ma stosunkowo długą historię, a biznes będący jego główną grupą docelową, napędza dynamikę jego dalszego rozwoju. Spośród dostępnych rozwiązań przyjrzałem się bliżej Amazon Redshift, a w artykule przedstawiam sposoby na wykorzystanie Pythona do integracji z hurtownią do opracowania przykładowych, podstawowych funkcjonalności związanych z raportowaniem.
Jakub Maślanka. Back-end developer w Merixstudio. Swoją przygodę z IT rozpoczął od C++, ale szybko “przesiadł się” na Pythona. Jego głównym polem zainteresowania jest podnoszenie jakość kodu i pokonywanie kolejnych wyzwań, z którymi zmaga się w realizacji projektów. Najczęściej działa w następujących technologiach: Python, Django, Django REST Framework, PostgreSQL, Docker, Linux, Git, AWS.
Data Warehouse zapewniają wgląd w działalność firmy przez przechowywanie łącznych danych historycznych z wielu różnych źródeł: aplikacji, systemów i innych rozwiązań. Zostały zaprojektowane tak, aby umożliwiać nie tylko gromadzenie dużych wolumenów danych, ale przede wszystkim analizowanie ich i przedstawianie wyników w przystępny dla odbiorcy sposób. Chociaż historia powstania hurtowni danych sięga lat 70, to dopiero w następnej dekadzie rozpoczęły się pierwsze zaawansowane prace nad ich komercyjnym wdrożeniem. Od tego czasu rozwój Warehouse’ów nabrał rozpędu i do dziś powstało wiele schematów, które pozwalają na jak najbardziej efektywne wykorzystanie danych ze struktury hurtowni (wymiarów, miar i tabel faktów).
Wśród najpopularniejszych można przy tym wymienić schematy gwiazdy, płatka śniegu i konstelacji. Oczywiście musimy pamiętać, że sama hurtownia to po prostu obszerna baza danych o strukturze ułatwiającej analizę, ale dopiero po zaimplementowaniu procesu ETL – Extract, Transform, Load możemy sensownie wykorzystać zawarte w niej informacje.
Spis treści
Hurtownie danych a Big Data
Stopień uporządkowania i ograniczenia narzucane w celu otrzymania jasnych, poprawnych wniosków z analizy danych najbardziej dzielą je z Big Data. Podstawową różnicą jest tu przy tym rodzaj wprowadzanych informacji. W tradycyjnym ujęciu, Warehouse gromadzi dane z wewnątrz firmy, których jakość i wiarygodność pozwala na stosunkowo rzeczową analizę. Problemem pojawia się jednak przy przetwarzaniu i badaniu mniej standardowych informacji niż te pochodzące z wdrożonych w przedsiębiorstwie systemów i aplikacji. A taki charakter mają najczęściej dane pochodzące z otoczenia firmy, które pozwalają np. na zgłębianie zmieniających się preferencji konsumentów.
Stopień ich skomplikowania znacznie utrudnia badania i przełożenie wniosków na konkretne modele biznesowe. Tu z pomocą przychodzą właśnie rozwiązania z zakresu Big Data. Są to jednak najczęściej dużo bardziej zaawansowane i o wiele droższe technologie, na które pozwolić sobie mogą najwięksi rynkowi gracze, znaczną część budżetu poświęcający na innowacje. Jednocześnie należy zaznaczyć, że przy stopniu rozwoju usług dzisiejszych Warehouse większości przedsiębiorstw wyniesie ogromną wiedzę z korzystania z oferowanych przez nie funkcjonalności.
Dlaczego Amazon Redshift?
Do podania przykładu integracji hurtowni danych wybrałem Amazon Redshift. Nie bez powodu na liście klientów tego dostawcy są takie marki jak: Pinterest, Nasdaq, Giełda Papierów Wartościowych w Londynie, Periscope Data czy Philips. Wśród głównych powodów, dla których firmy wybierają tę hurtownię danych można wymienić:
- szybkość
Dzięki funkcjonalnościom takim jak Columnar Data Storage, Advanced Compression, Massively Parallel Processing (MPP), Redshift znacznie przyspiesza zapytanie bazy danych. Przy analizie dużych wolumenów danych czas przetwarzania to jedno z najważniejszych kryteriów wyboru hurtowni.
- łatwa skalowalność
Podniesienie liczby węzłów, czyli zwiększenie zasobów, których używać będzie hurtownia danych wymaga zaledwie kilka kliknięć!
- proste zarządzanie
Redshift zarządza całą pracą związaną z uruchomieniem, działaniem i skalowaniem hurtownią danych. Intuicyjny interfejs, łatwość instalacji, automatyczne backupy i wyszukane wykresy — Redshift ma je wszystkie.
- opłacalność
Sposób w jaki Redshift przechowuje dane umożliwia ich efektywne kompresowanie, dzięki czemu oszczędza jeszcze więcej przestrzeni i znacznie ogranicza koszty. A ceny i tak należą do konkurencyjnych. Przy wyborze 3-letniego planu możemy otrzymać aż 70% zniżki, a 1 TB przestrzeni będzie nas wówczas kosztować zaledwie 1000$ rocznie. Co ciekawe, niektóre firmy przytaczają na swoim przykładzie oszczędności rzędu 90% w stosunku do konkurencyjnych dla Amazon Redshift rozwiązań.
Jak mogę używać Amazon Redshift z Pythonem?
Jest kilka sposobów na integrację Pythona z Amazon Redshift. Można po prostu zbierać dane i umożliwiać dostęp do nich poprzez Amazon Control Panel lub SQL, co jednak wymaga znajomości tego języka i pracy manualnej. Znacznie ciekawszym sposobem na wykorzystanie Pythona do pracy z amazonową hurtownią, który przy okazji pozwala na ograniczenie nużącej i powtarzalnej pracy, jest automatyzacja procesu tworzenia okresowych raportów. Co ważne, Amazon Redshift można zintegrować z usługami innych firm, np. narzędzi do tworzenia pulpitów, czyli tzw. dashboard (ie. Plotly, Salesforce), co zapewnia jeszcze pełniejszy wgląd do danych przy minimalnym wysiłku.
Wśród najbardziej zaawansowanych rozwiązań można z kolei wymienić analizę przy użyciu wyspecjalizowanych bibliotek (np. Pandas, SciPy, NumPy), które oferują narzędzia do interakcji ze zbiorami danych. Python za pomocą Redshifta umożliwia nam również wprowadzanie automatycznych zmian w zachowaniu aplikacji na podstawie badanych przez nią danych.
Przykład kodu
Redshift umożliwia określanie własnych Pythonowych funkcjonalności (UDFs) w SQL. Przygotowałem poniższy snippet do stworzenia funkcji zwracającej domenę najwyższego poziomu z adresu e-mail.
CREATE OR REPLACE FUNCTION f_find_top_domain( email VARCHAR(100) ) RETURNS VARCHAR(100) IMMUTABLE AS $ domain = email.split('@')[-1] return domain.split(‘.’)[-1] $ LANGUAGE plpythonu;
Stwórzmy zapytanie, które używa tej funkcji:
SELECT COUNT(*) AS domain_count, f_find_top_domain(email) AS domain FROM users WHERE email IS NOT NULL GROUP BY domain ORDER BY domain_count DESC LIMIT 3;
Jeśli chcemy wykonać to zapytanie w Redshift’s Query Editor to efekt będzie następujący:
Wykorzystując Pythona możemy w naszej aplikacji połączyć się ze swoim Redshiftem, tworzyć zapytania i podstawowe wykresy przedstawiające wyniki:
from sqlalchemy import create_engine import plotly.graph_objs as graph import plotly.io as plotly_io import pandas import requests requests.packages.urllib3.disable_warnings() query = ''' SELECT COUNT(*) AS domain_count, f_find_top_domain(email) AS domain FROM users WHERE email IS NOT NULL GROUP BY domain ORDER BY domain_count DESC LIMIT 4; ''' password = '***' user = '***' host = '***' port = 5439 db = '***' url = f'postgresql+psycopg2://{user}:{password}@{host}:{port}/{db}' engine = create_engine(url) data_frame = pandas.read_sql_query(query, engine) layout = graph.Layout(title='Top Level Domains', yaxis=dict(title='Sum')) data = [graph.Bar(x=data_frame.domain, y=data_frame.domain_count)] fig = graph.Figure(data=data, layout=layout) plotly_io.write_image(fig, ‘chart.png')
Oczywiście są to tylko przykłady funkcjonalności, które możemy stworzyć łącząc Pythona z potencjałem Amazon Redshift. Gorąco zachęcam do zapoznania się z usługą i testowania kolejnych rozwiązań do analizy danych zawartych w hurtowni.
Zdjęcie główne artykułu pochodzi z pexels.com.