Big Data
Inżynieria przetwarzania dużych zbiorów danych

Uwagi ogólne

  1. Do wszystkich zadań przygotuję odpowiednie zbiory testowe, ale potrzebuję na to trochę czasu.
  2. Zbiory testowe będą "duże".
  3. Państwa zadnie polega na stworzeniu rozwiązania, które daje odpowiedź w sensownym czasie. W praktyce oznacza to zwykle kilka(naście) minut.
  4. Każde zadanie, jeśli nie podano inaczej, jest za 1 punkt.
  5. Aby otrzymać ocenę 4.0 należy zdobyć 1 punkt, ocenę 5.0 - 2 punkty.
  6. Pewne zadania są zarezerwowane dla określonych "kombinacji" ocen - w razie wątpliwości proszę pisać. Lepiej zapytać, niż zrobić zadanie, którego nie zaakceptuję.
  7. Pula zadań będzie zmienna.
  8. Rozwiązania mogą być stworzone w oparciu o dowolną technologię/język itd, chyba, że w treści zadania powiedziane jest inaczej.

Zbiory danych

Numer zbioruZbioryInformacje dodatkowe
1
  1. images_0001.zip (238 MiB)
  2. images_0002.zip (9,6 MiB)
  3. images_0003.zip (356 MiB)
Zbiory przygotowano w oparciu o poniższe zbiory danych
  1. Flowers Recognition This dataset contains labeled 4242 images of flowers. The pictures are divided into five classes: chamomile, tulip, rose, sunflower, dandelion. For each class there are about 800 photos. Photos are not high resolution, about 320x240 pixels. Photos are not reduced to a single size, they have different proportions.
  2. Flower Color Images. Set for Classification The content is very simple: 210 images (128x128x3) with 10 species of flowering plants and the file with labels flower-labels.csv. Photo files are in the .png format and the labels are the integers.
    Label => Name: 0 => phlox; 1 => rose; 2 => calendula; 3 => iris; 4 => leucanthemum maximum; 5 => bellflower; 6 => viola; 7 => rudbeckia laciniata (Goldquelle); 8 => peony; 9 => aquilegia.
  3. Intel Image Classification Image Scene Classification of Multiclass. This Data contains around 25k images of size 150x150 distributed under 6 categories. {'buildings' -> 0, 'forest' -> 1, 'glacier' -> 2, 'mountain' -> 3, 'sea' -> 4, 'street' -> 5 }
  • 1: w oparciu o 1
  • 2: w oparciu o 2
  • 3: w oparciu o 3, użyto katalog seg_train + seg_test + seg_pred
2
  • Ostatnim słowem w każdym pliku jest ENDOFDATA (można to sprawdzić pisząc w terminalu Linuxa: tail -c 16 NAZWA_PLIKU).
  • Plik informacyjny z czasami generowania i rozmiarami.
  • Skrypt użyty do generowania (uwaga: każde uruchomienie generuje inny plik). Skryptu można użyć gdyby nie było możliwe pobranie przygotowanych przeze mnie zbiorów.
3
  • NBP Web API -- API pozwalające na pobieranie ze strony NBP kursów walut oraz cen złota w formacie XML oraz JSON.
4
  • tiny.tgz - malutki zbiór: trzy obiekty, w pierwszym trzy pokoje, w drugim dwa a w trzecim jeden.
  • small.tgz - większy zbiór danych; nie za duży, ale ręcznie będzie już trudno sprawdzić.
  • big.tgz - duży zbiór, do przeprowadzenia końcowch testów.
5
  • tiny.tgz - malutki zbiór: jeden obiekt, jedna trasa (trasa narysowana).
  • small.tgz - większy zbiór danych: dwa obiekty, po dwie trasy każdy (trasy narysowane).
  • big.tgz - duży zbiór (plik o wielkości 160MiB, po rozpakowaniu ponad 700MiB): 100 obiektów, każdy po 100 tras o długości z przedziału [10, 1000] punktów.
Wszystkie trasy w obszarze 1000 x 1000, z limitem czasu 1000.
6
7 Archiwum, plik data.zip zawiera w sobie następujące pliki (wygenerowane za pomocą skryptu generator.dat):
  • data.dat Każdy wiersz zawiera dane w formacie JSON postaci (tutaj dla przjrzystości "połamane" do trzech wierszy, ale w pliku zawsze jeden JSON jest w jednym wierszu):
    {"object1UUID": "1875402bba7246698e9d33593235cf81",
    "object2UUID": "cfb41537019a4524b7f2e08eba5eb873",
    "object3UUID": "dfc55f09fed143fba5d9fe37be7841cb"}
    
  • data_metadata.dat Każdy wiersz zawiera jedną liczbę określającą od którego bajtu rozpoczyna się odpowiedni JSON w pliku data.dat. Na przykład jeśli w pliku data_metadata.dat w wierszu N jest liczba Y wówczas N-ty JSON w pliku data.dat rozpoczyna się od bajtu Y (ewentualnie +/- 1 bajt, proszę sprawdzić).
  • uuid01.dat Plik zawierający wszystkie UUID-y wykorzystane jako UUID 1. W każdym wierszu znajduje się jeden UUID.
  • uuid02.dat Analogicznie do uuid01.dat, ale dotyczy UUID 2.
  • uuid03.dat Analogicznie do uuid01.dat, ale dotyczy UUID 3.

Zadanie 1.1 (wersja uproszczona):

Zadanie tylko dla osób, które z wykładu otrzymały ocenę 3.0 a z ćwiczeń i za cały przedmiot chciałyby otrzymać ocenę 3.5.
  1. Dany jest zbiór plików PNG.
  2. Dla każdego pliku PNG można wyliczyć średnią składowych RGB.
  3. Napisać skrypt/program/aplikację webową, która po podaniu trzech wartości liczbowych R, G, B wyszuka N (wartość podawana przez użytkownika) obrazów o średnich wartościach RGB najbardziej zbliżonych do podanych trzech wartości R, G, B.
  4. Do zadania pasują zbiory danych 1 z tabeli powyżej.

Zadanie 1.2: (wersja normalna)

  1. Dany jest zbiór plików PNG.
  2. Użytkownik określa rozmiar kafelka (np. 32 x 64 pixele (wysokość x szerokość)).
  3. Wyszukujemy wszystkie pliki PNG, z których można takie kafelki wyciąć, np. z pliku o rozmiarze 33 x 66 możemy wyciąć 6 takich kafelków.
  4. Dla każdego kafelka można wyliczyć średnią składowych RGB.
  5. Napisać skrypt/program/aplikację webową, która po podaniu trzech wartości liczbowych R, G, B oraz rozmiaru kafelka wyszuka N (wartość podawana przez użytkownika) kafelków o średnich wartościach RGB najbardziej zbliżonych do podanych trzech wartości R, G, B.
  6. Do zadania pasują zbiory danych 1 z tabeli powyżej.
  7. Koniecznie wykorzystać w rozwiązaniu wielowątkowość.

Zadanie 2:

  1. Dany jest plik tekstowy zawierający listę słów.
  2. Słowo jest dowolnym ciągiem znaków ze zbioru
    0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYX
    
    o długości od 3 do 20 znaków.
  3. Słowa w pliku rozdzielone są znakiem przecinka i wszystkie znajdują się w jednym wierszu.
  4. Należy podać listę 20 najczęściej wystepujących i 20 najrzadziej wystepujących słów.
  5. Należy koniecznie zapewnić aby program działał na dużych plikach testowych, tj. nie mniejszych niż 2GiB (docelowy plik tekstowy ma rozmiar prawie 10GiB).
  6. Do zadania pasują zbiory danych 2 z tabeli powyżej.
  7. Koniecznie wykorzystać w rozwiązaniu wielowątkowość.

Zadanie 3:

  1. Na stronie NBP Web API dostępne jest API pozwalające na pobieranie kursów walut oraz cen złota w formacie XML oraz JSON.
  2. Napisać stronę (lub aplikację desktopową ewentualnie mobilną), która po podaniu zakresu dat oraz wybraniu rodzaju waluty wypisze najdłuższy przedział czasu (w ramach podanego zakresu) w którym wybrana waluta osiągała wartości niemalejące.

Zadanie 4:

  1. W bazie przechowujemy informacje o bazie noclegowej.
  2. W bazie są dwa rodzaje dokumentów:
    • po jednym dokumencie opisującym każdy obiekt;
    • wiele dokumentów opisujących ofertę wybranego obiektu.
  3. Dokument opisujący obiekt jest następującej postaci
    {
    	"name": String, // np. "Rogate Ranczo"
    	"id": UUID, // np. 123e4567-e89b-12d3-a456-426614174000
    }
    
  4. Dokument opisujący ofertę jest następującej postaci
    {
    	"name": String, // np. "Apartament na poddaszu"
    	"id": UUID,
    	"idObject": UUID, // np. 123e4567-e89b-12d3-a456-426614174000
    	"readyFrom": Date,
    	"readyTo": Date,
    	"reservations": [{"from": Date, "to": Date},
    	                 {"from": Date, "to": Date},
    	                 {"from": Date, "to": Date},
    	                 {"from": Date, "to": Date}]
    }
    
    Pola readyFrom oraz readyTo oznaczają początek i koniec okresu w którym można dokonywać rezerwacji. Jeśli oba pola mają wartość null oznacza to, że oferta jest aktualna cały rok.
    Wartości String, UUID oraz Date oznaczają rodzaj danych a nie sposób ich kodowania; np. readyFrom może być zapisana jako napis a nie obiekt typu Data.
    reservations zawiera informacje o już istniejących rezerwacjach.
  5. Dane powinny być wczytywane z pliku XML, który będzie miał strukturę analogiczną do zaprezentowanych powyżej dokumentów: przykładowy plik z danymi obiektów, przykładowy plik z opisem oferty.
  6. Zadanie polega na napisaniu skryptu, który na podstawie trzech danych: daty od, daty do oraz ilości dni wypisze wszystkie oferty (wraz z informacją o obiekcie) w których jest możliwe zarezerwowanie noclegu na wskazaną ilość dni przy czym wszystkie te dni mieszczą się pomiędzy datą od a datą do (włącznie).
    Na przykład, jeśli jakaś oferta ma readyFrom="2020-06-01" oraz readyTo="2020-06-10", wówczas po podaniu informacji: dataOd="2020-06-03" dataDo="2020-06-09" iloscDni="5" zwrócona powinna zostać lista
    idObject id 2020-06-03 2020-06-07
    idObject id 2020-06-04 2020-06-08
    idObject id 2020-06-05 2020-06-09
    
  7. Do zadania pasują zbiory danych 4 z tabeli powyżej.

Zadanie 5:

Opis danych:

  1. Dane przedstawiają zapis pewnych ścieżek.
  2. Ścieżka jest zbiorem punktów połączonych odcinkami.
  3. Kolejne punkty w zbiorze, to kolejne punkty ścieżki.
  4. Ścieżki zostały wygenerowane w pewnej przestrzeni dwuwymiarowej.
  5. Długość każdej ścieżki może być inna.
  6. Każda ścieżka przypisana jest do pewnego obiektu (tego, który ja wygenerował).
  7. Każda ścieżka należąca do danego obiektu ma unikalny numer (w ramach obiektu). Tak więc ten sam obiekt nie może mieć dwóch różnych ścieżek o takim samym numerze. Dwa różne obiekty mogą mieć ścieżki o takich samych numerach.
  8. Obiekt znajdował się w punktach tworzących ściezkę w ściśle określonym czasie. Pomiędzy punktami czas zmienia się liniowo.
  9. Czas podany jest jako liczba rzeczywista i jest mierzony od pewnej umownej chwili zerowej.
  10. Przykładowe dane (plik paths.json, rysunek trasy):
    [
        {
            "idObject": 1,
            "idPath": 1,
            "points": [
                {
                    "x": 982.6654464446095,
                    "y": 919.1330053187946,
                    "time": 245.99081171100303
                },
                {
                    "x": 980.9310550639002,
                    "y": 919.2577873177349,
                    "time": 246.2019260643421
                },
                {
                    "x": 975.3658920290333,
                    "y": 924.2911863917317,
                    "time": 246.59851737294557
                },
                
                ...
                
                {
                    "x": 970.4810972349895,
                    "y": 917.1482447048913,
                    "time": 252.42230628974303
                }
            ]
        }
    ]
    
    1. Identyfikator obiektu: 1.
    2. Indentyfikator ścieżki obiektu 1: 1.
    3. Pierwszy punkt ścieżki ma współrzędne (x=982.6654464446095, y=919.1330053187946) i obiekt znajdował się w tym punkcie w chwili 245.99081171100303.
    4. Drugi punkt ścieżki ma współrzędne (x=980.9310550639002, y=919.2577873177349) i obiekt znajdował się w tym punkcie w chwili 246.2019260643421.
    5. Przejście od punktu pierwszego do drugiego zajęło obiektowi 246.2019260643421 - 245.99081171100303 = 0,211114353 jednostek czasu. Zatem dokładnie po 0,105557177 jednostkach znajdował się w połowie drogi pomiędzy punktem pierwszym i drugim.
  11. Do zadania pasują zbiory danych 5 z tabeli powyżej.
  12. Koniecznie wykorzystać w rozwiązaniu wielowątkowość.

Opis zadania:

  1. Jako użytkownik, chcę mieć możliwość określenia obszaru i czasu (rozpoczęcie i zakończenie).
  2. Jako użytkownik, chcę otrzymać informację który obiekt, którą ścieżką, w którym momencie wszedł i wyszedł z określonego przeze mnie obszaru (oczywiście z uwzględnieniem ograniczenia czasowego określonego przez rozpoczęcie i zakończenie).
  3. Informacja powinna być w postaci:
    identyfikatorObiektu identyfikatorSciezki momentWejscia_1 momentWyjscia_1 [momentWejscia_N momentWyjścia_N]
    
  4. Ponieważ w określonym przedziale czasu obiekt mógł wielokrotnie wchodzic i wychodzić z zadanego obszaru, dlatego w danym wierszu może być wiele par postaci (momentWejscia, momentWyjscia).

Zadanie 6:

Zadanie dla osób, które chcą z ćwiczeń otrzymać ocenę co najwyżej 4.0.
  1. Dokonać analizy danych 6 z tabeli powyżej. Proszę napisać skrypt, który zaplanuje podział całości trasy według określonego kryterium:
    1. Określi na ile etapów trzeba podzielić całą trasę, jeśli dziennie chcemy pokonywać nie więcej niż X kilometrów. Należy przy tym uwzględnić, że każde 100m podejścia równoważne jest pokonaniu (dodatkowo) 1km na płaszczyźnie.
    2. Podobnie jak wyżej, ale kryterium czasowe. W tym przypadku zakładamy, że dziennie chcemy iść (nie wliczamy przerw) X godzin. Zakładamy, że przez pierwszą godzinę możemy pokonać Y kilometrów a potem z każdą nastepną godziną o Z precent mniej w porównaniu z poprzednią.

Zadanie 7:

  1. Ze zbioru danych 7 z tabeli powyżej (plik dane.dat dostępny po extrakcji archiwum) wybrać wszystkie wiersze spełniające określone kryterium, m.in.:
    UUID_1 = X and UUID_2 = Y
    
    lub
    
    UUID_1 = X and (UUID_2 = Y or UUID_3 = Z)
    
    lub
    
    UUID_1 in_set (A, B C) and (UUID_2 = Y or UUID_3 = Z)
    
  2. Koniecznie wykorzystać w rozwiązaniu wielowątkowość.