Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
ed:lab_01 [2024/03/06 15:47]
pszwed [Join MoviesRatingsGenres]
ed:lab_01 [2024/03/14 12:43] (current)
pszwed [4.6 Join MoviesRatings]
Line 9: Line 9:
  
    
-===== Oprogramowanie =====+===== 1. Oprogramowanie =====
  
   * JDK 17 (Spark jest kompatybilny z JDK 8, 11 i 17)   * JDK 17 (Spark jest kompatybilny z JDK 8, 11 i 17)
Line 18: Line 18:
   * Przyda się w przyszłości: docker   * Przyda się w przyszłości: docker
  
-===== Projekt =====+===== 2. Projekt =====
  
 Tworzymy projekt oparty na Mavenie, a następnie modyfikujemy ''pom.xml'' Tworzymy projekt oparty na Mavenie, a następnie modyfikujemy ''pom.xml''
Line 155: Line 155:
 </code> </code>
  
-===== Główna klasa i konfiguracja =====+===== 3. Główna klasa i konfiguracja =====
  
 Napiszemy minimalistyczną klasę ''Main'' z funkcją ''main()'' Napiszemy minimalistyczną klasę ''Main'' z funkcją ''main()''
Line 242: Line 242:
  
  
-===== Ładowanie i konwersja danych =====+===== 4. Ładowanie i konwersja danych =====
  
-==== Pliki ====+==== 4.1 Pliki ====
 Wykorzystamy następujące pliki: Wykorzystamy następujące pliki:
  
Line 254: Line 254:
 Ich opis zamieszczony jest na tej stronie: [[https://home.agh.edu.pl/~pszwed/wiki/doku.php?id=pz1:java-movielens]] Ich opis zamieszczony jest na tej stronie: [[https://home.agh.edu.pl/~pszwed/wiki/doku.php?id=pz1:java-movielens]]
  
-==== Users ====+==== 4.2 Users ====
  
 <code java> <code java>
Line 333: Line 333:
 ale tracimy np. kotrole nad opcją ''nullable'' (która może być pożądana przy zapisie do bazy danych). ale tracimy np. kotrole nad opcją ''nullable'' (która może być pożądana przy zapisie do bazy danych).
  
-==== Movies ====+[[https://stackoverflow.com/questions/41705602/spark-dataframe-schema-nullable-fields|Dyskusja na temat nullable]] 
 + 
 +==== 4.3 Movies ====
  
 Dane o filmach zawierają niestrukturalne elementy: Dane o filmach zawierają niestrukturalne elementy:
Line 495: Line 497:
  
  
-==== Ratings ====+==== 4.4 Ratings ====
  
 Załaduj dane z pliku ''ratings.csv'' i wyświetl schemat. Załaduj dane z pliku ''ratings.csv'' i wyświetl schemat.
Line 612: Line 614:
   * as(Encoders.DOUBLE()) zamienia wiersze zbioru danych na obiekt wskazanego typu   * as(Encoders.DOUBLE()) zamienia wiersze zbioru danych na obiekt wskazanego typu
  
-==== Tags ====+==== 4.5 Tags ====
  
 **1.** Załaduj plik ''tags.csv'' i wyświetl informacje o jego zawartości i schemacie danych **1.** Załaduj plik ''tags.csv'' i wyświetl informacje o jego zawartości i schemacie danych
Line 684: Line 686:
  
  
-==== Join MoviesRatings ====+==== 4.6 Join MoviesRatings ====
  
 **1.** Załaduj plik ''movies.csv'' do zbioru df_movies\\ **1.** Załaduj plik ''movies.csv'' do zbioru df_movies\\
Line 774: Line 776:
 +-------+--------------------+--------------------+----+------+-------+------+-------------------+----------------------+ +-------+--------------------+--------------------+----+------+-------+------+-------------------+----------------------+
 </code> </code>
 +
 +:!: **Powtarzające się nazwy kolumn?** Po poperacji join:
 +<code java>
 +df_mr = df_mr.drop(df_ratings.col("movieId"));
 +</code>
 +
 +
  
 **2.** Pobierz listę wartości i wyświetl histogram.\\ **2.** Pobierz listę wartości i wyświetl histogram.\\
Line 864: Line 873:
    
  
-==== Join MoviesRatingsGenres ====+==== 4.7 Join MoviesRatingsGenres ====
  
 Jesteśmy zainteresowani informacjami o ocenach dla gatunków filmów.  Jesteśmy zainteresowani informacjami o ocenach dla gatunków filmów. 
Line 980: Line 989:
 </code>  </code> 
  
-  + 
 +==== 4.8 Join UsersTags ==== 
 + 
 +**1.** Wczytaj dane użytkowników do zbioru ''df_users'' oraz tagi do ''df_tags''
 + 
 +<code java> 
 +df_users.createOrReplaceTempView("users"); //vs. GlobalTempView 
 +df_tags.createOrReplaceTempView("tags"); 
 +</code> 
 + 
 + 
 + 
 +**2.** Utwórz złączony zbiór za pomocą kwerendy SQL 
 + 
 +<code java> 
 +String query = "..."; 
 + 
 +Dataset<Row> df_ut = spark.sql(query); 
 +</code> 
 + 
 +**3.** Zgrupuj dane po kolumnie ''email''  
 +  * Wzynacz listę tagów podczas grupowania za pomocą funkcji ''collect_list()'' 
 +  * Sklej listę tekstów (wprowadzając separator spacji) za pomocą funkcji ''concat_ws()'' 
 + 
 +<code> 
 ++--------------------+--------------------+ 
 +|               email|                tags| 
 ++--------------------+--------------------+ 
 +|amy.mcgrath@movie...|Everything you wa...| 
 +|faith.ross@movies...|   funny high school| 
 +|boris.howard@movi...|funny Highly quot...| 
 +|richard.oliver@mo...|music British Rom...| 
 +|karen.wilson@movi...|bad Sinbad Comedy...| 
 +|melanie.abraham@m...| jackie chan kung fu| 
 + 
 +... 
 + 
 +</code> 
 + 
 +Pobierz teksty z kolumny tags do listy i wydukuj 
 + 
 +<code> 
 +Everything you want is here adventure 
 +funny high school 
 +funny Highly quotable will ferrell Boxing story MMA Tom Hardy drugs Leonardo DiCaprio Martin Scorsese 
 +music British Romans 70mm World War II for katie austere 
 +bad Sinbad Comedy bad bad seen at the cinema Not Seen good seen more than once classic bad classic bad bad really bad Seann William Scott sci-fi boring remake Great movie Wesley Snipes not seen bad Ben Affleck classic BEST PICTURE classic hilarious steve carell HORRIBLE ACTING interesting 
 +jackie chan kung fu 
 +... 
 +</code>   
 + 
 + 
 +==== 4.9 Join UsersRatings ==== 
 + 
 +**1.** Wczytaj dane użytkowników do zbioru ''df_users'' oraz oceny do ''df_ratings''
 + 
 +**2. ** Złącz zbiory danych na podstawie identyfikatora użytkownika 
 + 
 +**3. ** Zgrupuj dane po kolumnie ''email'' agregując średnie oceny i liczbę ocen. Wyświetl dane, np. posortowane po średniej 
 + 
 +<code> 
 ++--------------------+------------------+-----+ 
 +|               email|        avg_rating|count| 
 ++--------------------+------------------+-----+ 
 +|victoria.dyer@mov...|               5.0|   20| 
 +|angela.morgan@mov...| 4.869565217391305|   23| 
 +|natalie.wallace@m...| 4.846153846153846|   26| 
 +|dorothy.lewis@mov...|4.8076923076923075|   26| 
 +|liam.short@movies...| 4.735294117647059|   34| 
 ++--------------------+------------------+-----+ 
 + 
 +</code> 
 + 
 +**4. ** Wyświetl wykres  
 + 
 +Wyświetl wykres punktowy, ''plt.plot().add(x, y,"o").label("data");'', w którym   
 +  * współrzędna x to ''avg_rating'' użytkownika 
 +  * współrzędna y odpowiada kolumnie  ''count'' 
 + 
 + 
 + 
 +{{ :ed:ratings-vs-average.png?direct&400 |}} 
 +  
 + 
 +Jako alternatywę -  możesz wyświetlić histogram 
 + 
 +===== 5. Sprawozdania ===== 
 + 
 +  * Tworzymy dokument ze zrzutami ekranu i fragmentami wyjścia, konwertujemy go do PDF 
 +  * W dokumencie dodajemy tytuły sekcji z numeracją, czyli np. **4.9 Join UserRatings** 
 +  * Przesyłamy skompresowany kod projektu 
ed/lab_01.1709736458.txt.gz · Last modified: 2024/03/06 15:47 by pszwed
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0