Dane w plikach CSV, JSON i SQL? Tak. AWS Athena
Kilka dni temu okazało się, że będę musiał popracować trochę z plikami tekstowymi, w których zapisane są lokalizacje GPS. Pliki zapisane są w formacie JSON, wiele lokalizacji w jednym pliku. Dwa pliki to jeden dzień zbierania danych (dwa serwery zbierające dane). Problem polegał na tym, że potrzebuję lokalizacje dotyczące konkretnego wydarzenia, a więc miejsca i czasu. W jednym pliku mogą być dane dotyczące lokalizacji z kilku dni, ale przesłane tego, konkretnego dnia. Cache w urządzeniach itp.
Pierwsze pomysły to jakieś programy odpalane na EC2, Lambdy, ściąganie i parsowanie plików lokalnie. Przypomniałem sobie jednak o jednej z usług Amazon Web Services, a mianowicie o Athena. Dziś będzie więc wpis bez programowania.
AWS Athena
Czym jest ta Athena? Jest to usługa, która pozwala nam na analizowanie danych zapisanych w S3 za pomocą standardowego języka SQL. Jako jedna z usług serverless, nie wymaga od nas zarządzania jakąkolwiek insfrastrukturą. Płacimy oczywiście tylko za użycie. W tej chwili jest to 5$ za przeskanowanie 1TB danych.
Tworzymy tabele
W pierwszym kroku musimy opisać Athenie jakoś nasze dane. W tym celu tworzymy tabelę odzwierciedlającą strukturę naszych danych. Athena od operacji DDL używa Hive, pod maską którego pracują serializery, nazwane SerDe. Mamy odstępne serlializery między innymi dla CSV, JSON, Parquet. Pełna lista jest dostępna oczywiście w FAQ usługi. Nie jest możliwe niestety dodanie własnych serializerów.
Przyjmijmy, że mamy w naszym koszyku S3 pliki, które zawierają dane w formacie
{ "deviceid" : 1, "longitude" : 50.012345, "latitude" : 18.0987, "timestamp" : 1501624834 }, { "deviceid" : 12, "longitude" : 51.012345, "latitude" : 19.0987, "timestamp" : 1501624844 }
I mamy takich plików sporo. Każdy z nich zawiera identfikator jakiegoś urządzenia, jego lokalizację, oraz czas lokalizacji.
Idziemy więc do Atheny i dla porządku tworzymy sobie jakąś bazę danych do testów:
i po jej utworzeniu przechodzimy to konfiguracji naszej tabeli
W pierwszym kroku nadajemy naszej tabeli nazwę oraz wskazujemy bucket S3, z którego Athena ma pobierać dane
określamy format danych, w których mamy dane
i przechodzimy do tworzenia kolumn. W naszym przypadku powinniśmy zdefiniować poniższe pola
Klikamy next i nie zawracamy sobie na razie głowy partycjami. Tworzymy tabelę.
Zamiast korzystać z wizarda, możemy oczywiście tworzyć struktury za pomocą DDL. W naszym przypadku taki sam rezultat dałoby polecenie o treści
CREATE EXTERNAL TABLE IF NOT EXISTS devdiariesdemo.lokalizacje ( `deviceid` bigint, `latitude` float, `longitude` float, `timestamp` bigint ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1' ) LOCATION 's3://pmathenatest/' TBLPROPERTIES ('has_encrypted_data'='false')
Korzystamy
Od tego momentu możemy na naszych danych do woli korzystać z SQL-a. Wyniki naszych zapytań lądują także na S3.
Każdy (tak myślę) ma w swoich zasobach AWS bazę sampledb. Możemy się więc także na początek pobawić Atheną bez korzystania z własnych danych. Nie o to chodzi, ale na początek możemy i tak.
Fajne. Zaoszczędziło mi to mnóstwo czasu i pracy. W wolnej chwili trzeba będzie głębiej się temu przyjrzeć.
Jakwidać, wystarczą dwa proste kroki. Upload danych do S3 i utworzenie tabeli na podstawie pliku. I już można w prosty sposób przetwarzać pliki tekstowe.